PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js

https://gitlab.com/nguyenthehiep3232/marius
JavaScript | 152 lines | 143 code | 0 blank | 9 comment | 34 complexity | ef120279a7be2031dfd65a746d0194cd MD5 | raw file
  1. "use strict";
  2. var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
  3. if (k2 === undefined) k2 = k;
  4. var desc = Object.getOwnPropertyDescriptor(m, k);
  5. if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
  6. desc = { enumerable: true, get: function() { return m[k]; } };
  7. }
  8. Object.defineProperty(o, k2, desc);
  9. }) : (function(o, m, k, k2) {
  10. if (k2 === undefined) k2 = k;
  11. o[k2] = m[k];
  12. }));
  13. var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
  14. Object.defineProperty(o, "default", { enumerable: true, value: v });
  15. }) : function(o, v) {
  16. o["default"] = v;
  17. });
  18. var __importStar = (this && this.__importStar) || function (mod) {
  19. if (mod && mod.__esModule) return mod;
  20. var result = {};
  21. if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
  22. __setModuleDefault(result, mod);
  23. return result;
  24. };
  25. Object.defineProperty(exports, "__esModule", { value: true });
  26. const tsutils = __importStar(require("tsutils"));
  27. const ts = __importStar(require("typescript"));
  28. const util = __importStar(require("../util"));
  29. const util_1 = require("../util");
  30. exports.default = util.createRule({
  31. name: 'no-unnecessary-type-arguments',
  32. meta: {
  33. docs: {
  34. description: 'Enforces that type arguments will not be used if not required',
  35. recommended: false,
  36. requiresTypeChecking: true,
  37. },
  38. fixable: 'code',
  39. messages: {
  40. unnecessaryTypeParameter: 'This is the default value for this type parameter, so it can be omitted.',
  41. },
  42. schema: [],
  43. type: 'suggestion',
  44. },
  45. defaultOptions: [],
  46. create(context) {
  47. const parserServices = util.getParserServices(context);
  48. const checker = parserServices.program.getTypeChecker();
  49. function getTypeForComparison(type) {
  50. if (util.isTypeReferenceType(type)) {
  51. return {
  52. type: type.target,
  53. typeArguments: util.getTypeArguments(type, checker),
  54. };
  55. }
  56. return {
  57. type,
  58. typeArguments: [],
  59. };
  60. }
  61. function checkTSArgsAndParameters(esParameters, typeParameters) {
  62. // Just check the last one. Must specify previous type parameters if the last one is specified.
  63. const i = esParameters.params.length - 1;
  64. const arg = esParameters.params[i];
  65. const param = typeParameters[i];
  66. if (!(param === null || param === void 0 ? void 0 : param.default)) {
  67. return;
  68. }
  69. // TODO: would like checker.areTypesEquivalent. https://github.com/Microsoft/TypeScript/issues/13502
  70. const defaultType = checker.getTypeAtLocation(param.default);
  71. const argTsNode = parserServices.esTreeNodeToTSNodeMap.get(arg);
  72. const argType = checker.getTypeAtLocation(argTsNode);
  73. // this check should handle some of the most simple cases of like strings, numbers, etc
  74. if (defaultType !== argType) {
  75. // For more complex types (like aliases to generic object types) - TS won't always create a
  76. // global shared type object for the type - so we need to resort to manually comparing the
  77. // reference type and the passed type arguments.
  78. // Also - in case there are aliases - we need to resolve them before we do checks
  79. const defaultTypeResolved = getTypeForComparison(defaultType);
  80. const argTypeResolved = getTypeForComparison(argType);
  81. if (
  82. // ensure the resolved type AND all the parameters are the same
  83. defaultTypeResolved.type !== argTypeResolved.type ||
  84. defaultTypeResolved.typeArguments.length !==
  85. argTypeResolved.typeArguments.length ||
  86. defaultTypeResolved.typeArguments.some((t, i) => t !== argTypeResolved.typeArguments[i])) {
  87. return;
  88. }
  89. }
  90. context.report({
  91. node: arg,
  92. messageId: 'unnecessaryTypeParameter',
  93. fix: fixer => fixer.removeRange(i === 0
  94. ? esParameters.range
  95. : [esParameters.params[i - 1].range[1], arg.range[1]]),
  96. });
  97. }
  98. return {
  99. TSTypeParameterInstantiation(node) {
  100. const expression = parserServices.esTreeNodeToTSNodeMap.get(node);
  101. const typeParameters = getTypeParametersFromNode(expression, checker);
  102. if (typeParameters) {
  103. checkTSArgsAndParameters(node, typeParameters);
  104. }
  105. },
  106. };
  107. },
  108. });
  109. function getTypeParametersFromNode(node, checker) {
  110. if (ts.isExpressionWithTypeArguments(node)) {
  111. return getTypeParametersFromType(node.expression, checker);
  112. }
  113. if (ts.isTypeReferenceNode(node)) {
  114. return getTypeParametersFromType(node.typeName, checker);
  115. }
  116. if (ts.isCallExpression(node) || ts.isNewExpression(node)) {
  117. return getTypeParametersFromCall(node, checker);
  118. }
  119. return undefined;
  120. }
  121. function getTypeParametersFromType(type, checker) {
  122. const symAtLocation = checker.getSymbolAtLocation(type);
  123. if (!symAtLocation) {
  124. return undefined;
  125. }
  126. const sym = getAliasedSymbol(symAtLocation, checker);
  127. const declarations = sym.getDeclarations();
  128. if (!declarations) {
  129. return undefined;
  130. }
  131. return (0, util_1.findFirstResult)(declarations, decl => ts.isClassLike(decl) ||
  132. ts.isTypeAliasDeclaration(decl) ||
  133. ts.isInterfaceDeclaration(decl)
  134. ? decl.typeParameters
  135. : undefined);
  136. }
  137. function getTypeParametersFromCall(node, checker) {
  138. const sig = checker.getResolvedSignature(node);
  139. const sigDecl = sig === null || sig === void 0 ? void 0 : sig.getDeclaration();
  140. if (!sigDecl) {
  141. return ts.isNewExpression(node)
  142. ? getTypeParametersFromType(node.expression, checker)
  143. : undefined;
  144. }
  145. return sigDecl.typeParameters;
  146. }
  147. function getAliasedSymbol(symbol, checker) {
  148. return tsutils.isSymbolFlagSet(symbol, ts.SymbolFlags.Alias)
  149. ? checker.getAliasedSymbol(symbol)
  150. : symbol;
  151. }
  152. //# sourceMappingURL=no-unnecessary-type-arguments.js.map