From 3db25c208757231f9ac1a2ff5980281489208bda Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 6 Dec 2019 01:11:29 -0500 Subject: [PATCH 1/8] @babel/eslint-parser: fix ImportExpression node to match ESTree spec --- eslint/babel-eslint-parser/test/babel-eslint-parser.js | 6 ++++++ packages/babel-parser/src/parser/expression.js | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/eslint/babel-eslint-parser/test/babel-eslint-parser.js b/eslint/babel-eslint-parser/test/babel-eslint-parser.js index d3aa67223b18..fb75112dc966 100644 --- a/eslint/babel-eslint-parser/test/babel-eslint-parser.js +++ b/eslint/babel-eslint-parser/test/babel-eslint-parser.js @@ -524,5 +524,11 @@ describe("babylon-to-espree", () => { const a = 1n; `); }); + + it("Dynamic Import", () => { + parseAndAssertSame(` + const a = import('a'); + `); + }); }); }); diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 8fd00cda91fb..9aa19dbcd199 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -759,6 +759,7 @@ export default class ExpressionParser extends LValParser { node: T, optional: boolean, ): T { + let nodeType = optional ? "OptionalCallExpression" : "CallExpression"; if (node.callee.type === "Import") { if (node.arguments.length !== 1) { this.raise(node.start, "import() requires exactly one argument"); @@ -768,11 +769,12 @@ export default class ExpressionParser extends LValParser { this.raise(importArg.start, "... is not allowed in import()"); } } + + if (this.hasPlugin("estree")) { + nodeType = "ImportExpression"; + } } - return this.finishNode( - node, - optional ? "OptionalCallExpression" : "CallExpression", - ); + return this.finishNode(node, nodeType); } parseCallExpressionArguments( From 8eb3dc6e18cd8cdd8fbd31f01b3217f3d9b03ad2 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 6 Dec 2019 01:13:05 -0500 Subject: [PATCH 2/8] Update caller name for @babel/core.parseSync --- eslint/babel-eslint-parser/src/parse.js | 2 +- packages/babel-parser/src/parser/expression.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/eslint/babel-eslint-parser/src/parse.js b/eslint/babel-eslint-parser/src/parse.js index 9c0a9a61d199..fc8a27abd116 100644 --- a/eslint/babel-eslint-parser/src/parse.js +++ b/eslint/babel-eslint-parser/src/parse.js @@ -34,7 +34,7 @@ export default function(code, options) { plugins: ["estree"], }, caller: { - name: "babel-eslint", + name: "@babel/eslint-parser", }, }; diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 9aa19dbcd199..c1a042bab5bb 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -772,6 +772,7 @@ export default class ExpressionParser extends LValParser { if (this.hasPlugin("estree")) { nodeType = "ImportExpression"; + node.source = node.arguments[0]; } } return this.finishNode(node, nodeType); From 2a425d0cf9f26c0f542812930fe20f1e0e12bc0e Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 6 Dec 2019 12:39:49 -0500 Subject: [PATCH 3/8] Move logic into estree plugin --- packages/babel-parser/src/parser/expression.js | 11 ++++------- packages/babel-parser/src/plugins/estree.js | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index c1a042bab5bb..8fd00cda91fb 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -759,7 +759,6 @@ export default class ExpressionParser extends LValParser { node: T, optional: boolean, ): T { - let nodeType = optional ? "OptionalCallExpression" : "CallExpression"; if (node.callee.type === "Import") { if (node.arguments.length !== 1) { this.raise(node.start, "import() requires exactly one argument"); @@ -769,13 +768,11 @@ export default class ExpressionParser extends LValParser { this.raise(importArg.start, "... is not allowed in import()"); } } - - if (this.hasPlugin("estree")) { - nodeType = "ImportExpression"; - node.source = node.arguments[0]; - } } - return this.finishNode(node, nodeType); + return this.finishNode( + node, + optional ? "OptionalCallExpression" : "CallExpression", + ); } parseCallExpressionArguments( diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 9a7ae0cf5918..900803904929 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -411,4 +411,18 @@ export default (superClass: Class): Class => super.toAssignableObjectExpressionProp(prop, isBinding, isLast); } } + + finishCallExpression( + node: T, + optional: boolean, + ): T & { source?: N.Node } { + const finishedNode = super.finishCallExpression(node, optional); + + if (node.callee.type === "Import") { + finishedNode.type = "ImportExpression"; + finishedNode.source = node.arguments[0]; + } + + return finishedNode; + } }; From f88e09136e1381b9e3278c61235a7e9830cbe187 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 6 Dec 2019 12:50:23 -0500 Subject: [PATCH 4/8] Add estree plugin tests --- .../estree/dynamic-import/basic/input.js | 1 + .../estree/dynamic-import/basic/output.json | 150 ++++++++++++++++++ .../estree/dynamic-import/options.json | 6 + 3 files changed, 157 insertions(+) create mode 100644 packages/babel-parser/test/fixtures/estree/dynamic-import/basic/input.js create mode 100644 packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json create mode 100644 packages/babel-parser/test/fixtures/estree/dynamic-import/options.json diff --git a/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/input.js b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/input.js new file mode 100644 index 000000000000..7fc63cc0957a --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/input.js @@ -0,0 +1 @@ +const a = import("a"); diff --git a/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json new file mode 100644 index 000000000000..b4f9e06f8a20 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json @@ -0,0 +1,150 @@ +{ + "type": "File", + "start": 0, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start": 0, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 6, + "end": 21, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 21 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + }, + "identifierName": "a" + }, + "name": "a" + }, + "init": { + "type": "ImportExpression", + "start": 10, + "end": 21, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 21 + } + }, + "callee": { + "type": "Import", + "start": 10, + "end": 16, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 16 + } + } + }, + "arguments": [ + { + "type": "Literal", + "start": 17, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 20 + } + }, + "value": "a", + "raw": "\"a\"" + } + ], + "source": { + "type": "Literal", + "start": 17, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 20 + } + }, + "value": "a", + "raw": "\"a\"" + } + } + } + ], + "kind": "const" + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json b/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json new file mode 100644 index 000000000000..a3c47fadb236 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "estree", + "dynamicImport" + ] +} From 80e20ad92ce8f6151d914b10c8087188d1153e46 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 6 Dec 2019 15:23:38 -0500 Subject: [PATCH 5/8] Fix Flow error --- packages/babel-parser/src/plugins/estree.js | 11 +++++++---- packages/babel-parser/src/types.js | 9 ++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 900803904929..9da149f0b7f4 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -415,14 +415,17 @@ export default (superClass: Class): Class => finishCallExpression( node: T, optional: boolean, - ): T & { source?: N.Node } { - const finishedNode = super.finishCallExpression(node, optional); - + ): T | N.EstreeImportExpression { if (node.callee.type === "Import") { + const finishedNode: N.EstreeImportExpression = (super.finishCallExpression( + node, + optional, + ): any); finishedNode.type = "ImportExpression"; finishedNode.source = node.arguments[0]; + return finishedNode; } - return finishedNode; + return super.finishCallExpression(node, optional); } }; diff --git a/packages/babel-parser/src/types.js b/packages/babel-parser/src/types.js index 71e83d142958..fb88ced550e2 100644 --- a/packages/babel-parser/src/types.js +++ b/packages/babel-parser/src/types.js @@ -1013,7 +1013,7 @@ export type FlowInterfaceType = NodeBase & { body: FlowObjectTypeAnnotation, }; -// estree +// ESTree export type EstreeProperty = NodeBase & { type: "Property", @@ -1039,6 +1039,13 @@ export type EstreeMethodDefinition = NodeBase & { variance?: ?FlowVariance, }; +export type EstreeImportExpression = NodeBase & { + type: "ImportExpression", + callee: Import, + arguments: Array, + source: Expression, +}; + // === === === === // TypeScript // === === === === From 93a345133c816dfc166d1a49bfa50e1c23d272bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 7 Dec 2019 01:39:21 +0100 Subject: [PATCH 6/8] Fix flow --- packages/babel-parser/src/parser/expression.js | 2 +- packages/babel-parser/src/plugins/estree.js | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 8fd00cda91fb..e844bb7f91db 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -758,7 +758,7 @@ export default class ExpressionParser extends LValParser { finishCallExpression( node: T, optional: boolean, - ): T { + ): N.Expression { if (node.callee.type === "Import") { if (node.arguments.length !== 1) { this.raise(node.start, "import() requires exactly one argument"); diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 9da149f0b7f4..b25a97a73182 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -415,17 +415,14 @@ export default (superClass: Class): Class => finishCallExpression( node: T, optional: boolean, - ): T | N.EstreeImportExpression { + ): N.Expression { + super.finishCallExpression(node, optional); + if (node.callee.type === "Import") { - const finishedNode: N.EstreeImportExpression = (super.finishCallExpression( - node, - optional, - ): any); - finishedNode.type = "ImportExpression"; - finishedNode.source = node.arguments[0]; - return finishedNode; + ((node: N.Node): N.EstreeImportExpression).type = "ImportExpression"; + ((node: N.Node): N.EstreeImportExpression).source = node.arguments[0]; } - return super.finishCallExpression(node, optional); + return node; } }; From 2e77d7604dbdb518e3d5482af89f12655a74b57e Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Tue, 10 Dec 2019 11:38:36 -0500 Subject: [PATCH 7/8] Remove extra properties on ImportExpression node --- packages/babel-parser/src/plugins/estree.js | 10 ++++++ packages/babel-parser/src/types.js | 2 -- .../invalid-assignment-pattern-1/options.json | 6 ++-- .../invalid-assignment-pattern-2/options.json | 6 ++-- .../invalid-assignment-pattern-3/options.json | 6 ++-- .../invalid-assignment-pattern-4/options.json | 6 ++-- .../invalid-assignment-pattern-5/options.json | 6 ++-- .../test/fixtures/estree/bigInt/options.json | 5 +-- .../estree/dynamic-import/basic/output.json | 34 ------------------- .../estree/dynamic-import/options.json | 5 +-- 10 files changed, 22 insertions(+), 64 deletions(-) diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index b25a97a73182..fbc98963242b 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -421,8 +421,18 @@ export default (superClass: Class): Class => if (node.callee.type === "Import") { ((node: N.Node): N.EstreeImportExpression).type = "ImportExpression"; ((node: N.Node): N.EstreeImportExpression).source = node.arguments[0]; + delete node.arguments; + delete node.callee; } return node; } + + // ImportExpressions do not have an arguments array. + toReferencedListDeep( + exprList: $ReadOnlyArray = [], + isParenthesizedExpr?: boolean, + ): $ReadOnlyArray { + return super.toReferencedListDeep(exprList, isParenthesizedExpr); + } }; diff --git a/packages/babel-parser/src/types.js b/packages/babel-parser/src/types.js index fb88ced550e2..597b2f5d674c 100644 --- a/packages/babel-parser/src/types.js +++ b/packages/babel-parser/src/types.js @@ -1041,8 +1041,6 @@ export type EstreeMethodDefinition = NodeBase & { export type EstreeImportExpression = NodeBase & { type: "ImportExpression", - callee: Import, - arguments: Array, source: Expression, }; diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-1/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-1/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-1/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-1/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-2/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-2/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-2/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-2/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-3/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-3/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-3/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-3/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-4/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-4/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-4/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-4/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-5/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-5/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-5/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-5/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/estree/bigInt/options.json b/packages/babel-parser/test/fixtures/estree/bigInt/options.json index da7e9e174f39..0df9db5c35e7 100644 --- a/packages/babel-parser/test/fixtures/estree/bigInt/options.json +++ b/packages/babel-parser/test/fixtures/estree/bigInt/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - "estree", - "bigInt" - ] + "plugins": ["estree", "bigInt"] } diff --git a/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json index b4f9e06f8a20..be4caee8d685 100644 --- a/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json +++ b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json @@ -89,40 +89,6 @@ "column": 21 } }, - "callee": { - "type": "Import", - "start": 10, - "end": 16, - "loc": { - "start": { - "line": 1, - "column": 10 - }, - "end": { - "line": 1, - "column": 16 - } - } - }, - "arguments": [ - { - "type": "Literal", - "start": 17, - "end": 20, - "loc": { - "start": { - "line": 1, - "column": 17 - }, - "end": { - "line": 1, - "column": 20 - } - }, - "value": "a", - "raw": "\"a\"" - } - ], "source": { "type": "Literal", "start": 17, diff --git a/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json b/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json index a3c47fadb236..9e48801bb9eb 100644 --- a/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json +++ b/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - "estree", - "dynamicImport" - ] + "plugins": ["estree", "dynamicImport"] } From 440234a2d843228166fe72771ce51e8810c5586f Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Wed, 11 Dec 2019 00:14:57 -0500 Subject: [PATCH 8/8] Incorporate review feedback --- packages/babel-parser/src/parser/lval.js | 4 +--- packages/babel-parser/src/plugins/estree.js | 12 ++++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 9a726a36dc2f..383b5f3edc1a 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -228,7 +228,7 @@ export default class LValParser extends NodeUtils { toReferencedListDeep( exprList: $ReadOnlyArray, isParenthesizedExpr?: boolean, - ): $ReadOnlyArray { + ): void { this.toReferencedList(exprList, isParenthesizedExpr); for (const expr of exprList) { @@ -236,8 +236,6 @@ export default class LValParser extends NodeUtils { this.toReferencedListDeep(expr.elements); } } - - return exprList; } // Parses spread element. diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index fbc98963242b..fc7640de1764 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -428,11 +428,15 @@ export default (superClass: Class): Class => return node; } - // ImportExpressions do not have an arguments array. toReferencedListDeep( - exprList: $ReadOnlyArray = [], + exprList: $ReadOnlyArray, isParenthesizedExpr?: boolean, - ): $ReadOnlyArray { - return super.toReferencedListDeep(exprList, isParenthesizedExpr); + ): void { + // ImportExpressions do not have an arguments array. + if (!exprList) { + return; + } + + super.toReferencedListDeep(exprList, isParenthesizedExpr); } };