diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 009bfdcdcb73..17ef919099f6 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -272,31 +272,6 @@ export default function convert(config: ConvertConfig): ESTreeNode | null { }; } - /** - * Converts a child into a specified heritage node. - * @param {AST_NODE_TYPES} nodeType Type of node to be used - * @param {ts.ExpressionWithTypeArguments} child The TypeScript AST node to convert. - * @returns {ESTreeNode} The heritage node. - */ - function convertHeritageClause( - nodeType: AST_NODE_TYPES, - child: ts.ExpressionWithTypeArguments - ): ESTreeNode { - const expression = convertChild(child.expression)!; - const classImplementsNode: ESTreeNode = { - type: nodeType, - loc: expression.loc, - range: expression.range, - expression - }; - if (child.typeArguments && child.typeArguments.length) { - classImplementsNode.typeParameters = convertTypeArgumentsToTypeParameters( - child.typeArguments - ); - } - return classImplementsNode; - } - /** * Converts an array of ts.Node parameters into an array of ESTreeNode params * @param {ts.Node[]} parameters An array of ts.Node params to be converted @@ -1465,9 +1440,7 @@ export default function convert(config: ConvertConfig): ESTreeNode | null { }); if (implementsClause) { - result.implements = implementsClause.types.map(el => - convertHeritageClause(AST_NODE_TYPES.TSClassImplements, el) - ); + result.implements = implementsClause.types.map(convertChild); } if (hasModifier(SyntaxKind.DeclareKeyword, node)) { @@ -2334,6 +2307,23 @@ export default function convert(config: ConvertConfig): ESTreeNode | null { break; } + case SyntaxKind.ExpressionWithTypeArguments: { + Object.assign(result, { + type: + parent && parent.kind === SyntaxKind.InterfaceDeclaration + ? AST_NODE_TYPES.TSInterfaceHeritage + : AST_NODE_TYPES.TSClassImplements, + expression: convertChild(node.expression) + }); + + if (node.typeArguments && node.typeArguments.length) { + result.typeParameters = convertTypeArgumentsToTypeParameters( + node.typeArguments + ); + } + break; + } + case SyntaxKind.InterfaceDeclaration: { const interfaceHeritageClauses = node.heritageClauses || []; @@ -2386,15 +2376,11 @@ export default function convert(config: ConvertConfig): ESTreeNode | null { for (const heritageClause of interfaceHeritageClauses) { if (heritageClause.token === SyntaxKind.ExtendsKeyword) { for (const n of heritageClause.types) { - interfaceExtends.push( - convertHeritageClause(AST_NODE_TYPES.TSInterfaceHeritage, n) - ); + interfaceExtends.push(convertChild(n)); } } else if (heritageClause.token === SyntaxKind.ImplementsKeyword) { for (const n of heritageClause.types) { - interfaceImplements.push( - convertHeritageClause(AST_NODE_TYPES.TSInterfaceHeritage, n) - ); + interfaceImplements.push(convertChild(n)); } } } diff --git a/packages/typescript-estree/src/temp-types-based-on-js-source.ts b/packages/typescript-estree/src/temp-types-based-on-js-source.ts index a002b749f5bd..a2234fc1308a 100644 --- a/packages/typescript-estree/src/temp-types-based-on-js-source.ts +++ b/packages/typescript-estree/src/temp-types-based-on-js-source.ts @@ -34,8 +34,8 @@ export interface ESTreeNode { value?: string; expression?: ESTreeNode | null; decorators?: (ESTreeNode | null)[]; - implements?: ESTreeNode[]; - extends?: ESTreeNode[]; + implements?: (ESTreeNode | null)[]; + extends?: (ESTreeNode | null)[]; const?: boolean; declare?: boolean; global?: boolean; diff --git a/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts b/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts index 8b3ec98a2f93..c8556789e1f6 100644 --- a/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts +++ b/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts @@ -329,17 +329,14 @@ tester.addFixturePatternConfig('typescript/basics', { */ 'arrow-function-with-type-parameters', /** - * Babel error: parameterName is not included into range of TSTypeAnnotation - * TODO: report it to babel + * PR for this type predicate ranges has been merged into Babel: https://github.com/babel/babel/pull/9339 + * TODO: remove me in next babel > 7.2.3 */ 'type-guard-in-method', /** * there is difference in range between babel and ts-estree */ - 'class-with-implements-generic-multiple', - 'class-with-implements-generic', 'export-declare-const-named-enum', - 'interface-with-extends-type-parameters', 'interface-with-optional-properties', /** * Babel parses it as TSQualifiedName @@ -350,6 +347,7 @@ tester.addFixturePatternConfig('typescript/basics', { /** * Babel bug for parsing exported abstract interface * https://github.com/babel/babel/issues/9304 + * PR: https://github.com/babel/babel/pull/9336 */ 'abstract-interface', /** @@ -395,8 +393,8 @@ tester.addFixturePatternConfig('typescript/basics', { */ 'type-assertion-arrow-function', /** - * Babel parses this incorrectly - * https://github.com/babel/babel/issues/9325 + * PR for type parsing declare and abstract classes has been merged into Babel: https://github.com/babel/babel/pull/9328 + * TODO: remove me in next babel > 7.2.3 */ 'class-multi-line-keyword-declare', 'class-multi-line-keyword-abstract' @@ -454,8 +452,8 @@ tester.addFixturePatternConfig('typescript/types', { fileType: 'ts', ignore: [ /** - * Babel bug for range of Identifier in TSIndexSignature - * https://github.com/babel/babel/issues/9319 + * PR for type Identifier in TSIndexSignature ranges has been merged into Babel: https://github.com/babel/babel/pull/9335 + * TODO: remove me in next babel > 7.2.3 */ 'index-signature', 'index-signature-readonly', diff --git a/packages/typescript-estree/tests/lib/__snapshots__/typescript.ts.snap b/packages/typescript-estree/tests/lib/__snapshots__/typescript.ts.snap index 9ddc5b47f8c3..5d070828fac6 100644 --- a/packages/typescript-estree/tests/lib/__snapshots__/typescript.ts.snap +++ b/packages/typescript-estree/tests/lib/__snapshots__/typescript.ts.snap @@ -14823,7 +14823,7 @@ Object { }, "loc": Object { "end": Object { - "column": 24, + "column": 27, "line": 1, }, "start": Object { @@ -14833,7 +14833,7 @@ Object { }, "range": Array [ 21, - 24, + 27, ], "type": "TSClassImplements", "typeParameters": Object { @@ -15155,7 +15155,7 @@ Object { }, "loc": Object { "end": Object { - "column": 24, + "column": 30, "line": 1, }, "start": Object { @@ -15165,7 +15165,7 @@ Object { }, "range": Array [ 21, - 24, + 30, ], "type": "TSClassImplements", "typeParameters": Object { @@ -51372,7 +51372,7 @@ Object { }, "loc": Object { "end": Object { - "column": 28, + "column": 31, "line": 1, }, "start": Object { @@ -51382,7 +51382,7 @@ Object { }, "range": Array [ 25, - 28, + 31, ], "type": "TSInterfaceHeritage", "typeParameters": Object {