From 324f3eb7e6132ac644034d8bf517db34a4aa8ca5 Mon Sep 17 00:00:00 2001 From: Armano Date: Tue, 15 Jan 2019 02:23:05 +0100 Subject: [PATCH 1/5] fix(estree): correct location and range for heritage clause --- packages/typescript-estree/src/convert.ts | 11 +++++++---- .../tests/ast-alignment/fixtures-to-test.ts | 8 ++++---- .../tests/lib/__snapshots__/typescript.ts.snap | 12 ++++++------ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 009bfdcdcb73..420a2e235c39 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -283,17 +283,20 @@ export default function convert(config: ConvertConfig): ESTreeNode | null { child: ts.ExpressionWithTypeArguments ): ESTreeNode { const expression = convertChild(child.expression)!; - const classImplementsNode: ESTreeNode = { + const range: [number, number] = [child.getStart(), child.end]; + let classImplementsNode: ESTreeNode = { type: nodeType, - loc: expression.loc, - range: expression.range, - expression + expression, + range: range, + loc: getLocFor(range[0], range[1], ast) }; + if (child.typeArguments && child.typeArguments.length) { classImplementsNode.typeParameters = convertTypeArgumentsToTypeParameters( child.typeArguments ); } + return classImplementsNode; } 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 6ead060e9518..4bbb160d0f78 100644 --- a/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts +++ b/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts @@ -317,16 +317,13 @@ tester.addFixturePatternConfig('typescript/basics', { 'arrow-function-with-type-parameters', /** * Babel error: parameterName is not included into range of TSTypeAnnotation - * TODO: report it to babel + * https://github.com/babel/babel/issues/9337 */ '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 @@ -337,6 +334,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', /** @@ -384,6 +382,7 @@ tester.addFixturePatternConfig('typescript/basics', { /** * Babel parses this incorrectly * https://github.com/babel/babel/issues/9325 + * PR: https://github.com/babel/babel/pull/9328 */ 'class-multi-line-keyword-declare', 'class-multi-line-keyword-abstract' @@ -443,6 +442,7 @@ tester.addFixturePatternConfig('typescript/types', { /** * Babel bug for range of Identifier in TSIndexSignature * https://github.com/babel/babel/issues/9319 + * PR: https://github.com/babel/babel/pull/9335 */ '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 { From 82b08fc30d17a7a7640e2070ed03fba855083c28 Mon Sep 17 00:00:00 2001 From: Armano Date: Tue, 15 Jan 2019 02:39:07 +0100 Subject: [PATCH 2/5] fix(estree): make sure that heritage is in treeNodeMaps --- packages/typescript-estree/src/convert.ts | 57 +++++++------------ .../src/temp-types-based-on-js-source.ts | 4 +- 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 420a2e235c39..17ef919099f6 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -272,34 +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 range: [number, number] = [child.getStart(), child.end]; - let classImplementsNode: ESTreeNode = { - type: nodeType, - expression, - range: range, - loc: getLocFor(range[0], range[1], ast) - }; - - 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 @@ -1468,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)) { @@ -2337,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 || []; @@ -2389,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; From d40072914ca6790b6c3807aac88abae882cac37c Mon Sep 17 00:00:00 2001 From: Armano Date: Tue, 15 Jan 2019 03:31:40 +0100 Subject: [PATCH 3/5] chore: add note to fixtures-to-test --- .../typescript-estree/tests/ast-alignment/fixtures-to-test.ts | 1 + 1 file changed, 1 insertion(+) 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 4bbb160d0f78..f84f49f41ce7 100644 --- a/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts +++ b/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts @@ -318,6 +318,7 @@ tester.addFixturePatternConfig('typescript/basics', { /** * Babel error: parameterName is not included into range of TSTypeAnnotation * https://github.com/babel/babel/issues/9337 + * PR: https://github.com/babel/babel/pull/9339 */ 'type-guard-in-method', /** From 6c2558a17a0f9543a5cb73d80f6771328831bb0d Mon Sep 17 00:00:00 2001 From: Armano Date: Tue, 15 Jan 2019 12:52:30 +0100 Subject: [PATCH 4/5] chore: update babel PR status --- .../tests/ast-alignment/fixtures-to-test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 f84f49f41ce7..6324c4ddd7c5 100644 --- a/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts +++ b/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts @@ -316,9 +316,8 @@ tester.addFixturePatternConfig('typescript/basics', { */ 'arrow-function-with-type-parameters', /** - * Babel error: parameterName is not included into range of TSTypeAnnotation - * https://github.com/babel/babel/issues/9337 - * PR: https://github.com/babel/babel/pull/9339 + * 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', /** From ea4c1190dabeb85a5b0243130a77bb039e574b76 Mon Sep 17 00:00:00 2001 From: Armano Date: Tue, 15 Jan 2019 14:00:21 +0100 Subject: [PATCH 5/5] chore: update nots --- .../tests/ast-alignment/fixtures-to-test.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) 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 6324c4ddd7c5..d72971a9cc61 100644 --- a/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts +++ b/packages/typescript-estree/tests/ast-alignment/fixtures-to-test.ts @@ -380,9 +380,8 @@ tester.addFixturePatternConfig('typescript/basics', { */ 'type-assertion-arrow-function', /** - * Babel parses this incorrectly - * https://github.com/babel/babel/issues/9325 - * PR: https://github.com/babel/babel/pull/9328 + * 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' @@ -440,9 +439,8 @@ tester.addFixturePatternConfig('typescript/types', { fileType: 'ts', ignore: [ /** - * Babel bug for range of Identifier in TSIndexSignature - * https://github.com/babel/babel/issues/9319 - * PR: https://github.com/babel/babel/pull/9335 + * 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',