From 352b18f5fd5ce8a0231d006439aed0bf97582143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 17 May 2023 11:32:24 +0300 Subject: [PATCH] Fix parsing of `import type ` with flow --- packages/babel-parser/src/parser/statement.ts | 8 +++- .../es2015/uncategorised/96/options.json | 3 +- .../es2015/uncategorised/96/output.json | 40 +++++++++++++++++++ .../invalid-import-default/options.json | 3 -- .../invalid-import-default/output.json | 40 +++++++++++++++++++ .../invalid-flow-typeof-import-2/options.json | 2 +- .../flow/imports/import-type-keyword/input.js | 1 + .../imports/import-type-keyword/output.json | 38 ++++++++++++++++++ 8 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/es2015/uncategorised/96/output.json delete mode 100644 packages/babel-parser/test/fixtures/esprima/es2015-import-declaration/invalid-import-default/options.json create mode 100644 packages/babel-parser/test/fixtures/esprima/es2015-import-declaration/invalid-import-default/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/imports/import-type-keyword/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/imports/import-type-keyword/output.json diff --git a/packages/babel-parser/src/parser/statement.ts b/packages/babel-parser/src/parser/statement.ts index 4059fe809f70..0d6b3950e97f 100644 --- a/packages/babel-parser/src/parser/statement.ts +++ b/packages/babel-parser/src/parser/statement.ts @@ -1,6 +1,7 @@ import type * as N from "../types"; import { tokenIsIdentifier, + tokenIsKeywordOrIdentifier, tokenIsLoop, tokenIsTemplate, tt, @@ -2940,7 +2941,7 @@ export default abstract class StatementParser extends ExpressionParser { const phaseIdentifier = this.parseIdentifier(true); const { type } = this.state; - const isImportPhase = tokenIsIdentifier(type) + const isImportPhase = tokenIsKeywordOrIdentifier(type) ? // OK: import x from "foo"; // OK: import from from "foo"; // NO: import from "foo"; @@ -3258,7 +3259,10 @@ export default abstract class StatementParser extends ExpressionParser { this.finishImportSpecifier(specifier, "ImportDefaultSpecifier"), ); return true; - } else if (tokenIsIdentifier(this.state.type)) { + } else if ( + // We allow keywords, and parseImportSpecifierLocal will report a recoverable error + tokenIsKeywordOrIdentifier(this.state.type) + ) { this.parseImportSpecifierLocal( node, this.startNode(), diff --git a/packages/babel-parser/test/fixtures/es2015/uncategorised/96/options.json b/packages/babel-parser/test/fixtures/es2015/uncategorised/96/options.json index 9b76c337e1c3..2104ca43283f 100644 --- a/packages/babel-parser/test/fixtures/es2015/uncategorised/96/options.json +++ b/packages/babel-parser/test/fixtures/es2015/uncategorised/96/options.json @@ -1,4 +1,3 @@ { - "sourceType": "module", - "throws": "Unexpected token, expected \"{\" (1:7)" + "sourceType": "module" } diff --git a/packages/babel-parser/test/fixtures/es2015/uncategorised/96/output.json b/packages/babel-parser/test/fixtures/es2015/uncategorised/96/output.json new file mode 100644 index 000000000000..494c6112d903 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/uncategorised/96/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":25,"index":25}}, + "errors": [ + "SyntaxError: Unexpected keyword 'default'. (1:7)" + ], + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":25,"index":25}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ImportDeclaration", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":25,"index":25}}, + "specifiers": [ + { + "type": "ImportDefaultSpecifier", + "start":7,"end":14,"loc":{"start":{"line":1,"column":7,"index":7},"end":{"line":1,"column":14,"index":14}}, + "local": { + "type": "Identifier", + "start":7,"end":14,"loc":{"start":{"line":1,"column":7,"index":7},"end":{"line":1,"column":14,"index":14},"identifierName":"default"}, + "name": "default" + } + } + ], + "source": { + "type": "StringLiteral", + "start":20,"end":25,"loc":{"start":{"line":1,"column":20,"index":20},"end":{"line":1,"column":25,"index":25}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + } + } + ], + "directives": [] + } +} diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-import-declaration/invalid-import-default/options.json b/packages/babel-parser/test/fixtures/esprima/es2015-import-declaration/invalid-import-default/options.json deleted file mode 100644 index f2ecbd9741e7..000000000000 --- a/packages/babel-parser/test/fixtures/esprima/es2015-import-declaration/invalid-import-default/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token, expected \"{\" (1:7)" -} diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-import-declaration/invalid-import-default/output.json b/packages/babel-parser/test/fixtures/esprima/es2015-import-declaration/invalid-import-default/output.json new file mode 100644 index 000000000000..494c6112d903 --- /dev/null +++ b/packages/babel-parser/test/fixtures/esprima/es2015-import-declaration/invalid-import-default/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":25,"index":25}}, + "errors": [ + "SyntaxError: Unexpected keyword 'default'. (1:7)" + ], + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":25,"index":25}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ImportDeclaration", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":25,"index":25}}, + "specifiers": [ + { + "type": "ImportDefaultSpecifier", + "start":7,"end":14,"loc":{"start":{"line":1,"column":7,"index":7},"end":{"line":1,"column":14,"index":14}}, + "local": { + "type": "Identifier", + "start":7,"end":14,"loc":{"start":{"line":1,"column":7,"index":7},"end":{"line":1,"column":14,"index":14},"identifierName":"default"}, + "name": "default" + } + } + ], + "source": { + "type": "StringLiteral", + "start":20,"end":25,"loc":{"start":{"line":1,"column":20,"index":20},"end":{"line":1,"column":25,"index":25}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + } + } + ], + "directives": [] + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/import-reflection/invalid-flow-typeof-import-2/options.json b/packages/babel-parser/test/fixtures/experimental/import-reflection/invalid-flow-typeof-import-2/options.json index a47f856f23a1..bfd6a7a73ddd 100644 --- a/packages/babel-parser/test/fixtures/experimental/import-reflection/invalid-flow-typeof-import-2/options.json +++ b/packages/babel-parser/test/fixtures/experimental/import-reflection/invalid-flow-typeof-import-2/options.json @@ -4,5 +4,5 @@ "flow" ], "sourceType": "module", - "throws": "Unexpected token, expected \"{\" (1:14)" + "throws": "Unexpected token, expected \"from\" (1:21)" } diff --git a/packages/babel-parser/test/fixtures/flow/imports/import-type-keyword/input.js b/packages/babel-parser/test/fixtures/flow/imports/import-type-keyword/input.js new file mode 100644 index 000000000000..0da6d5f06a16 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/imports/import-type-keyword/input.js @@ -0,0 +1 @@ +import type switch from 'foo'; diff --git a/packages/babel-parser/test/fixtures/flow/imports/import-type-keyword/output.json b/packages/babel-parser/test/fixtures/flow/imports/import-type-keyword/output.json new file mode 100644 index 000000000000..17b2d427b043 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/imports/import-type-keyword/output.json @@ -0,0 +1,38 @@ +{ + "type": "File", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":30,"index":30}}, + "program": { + "type": "Program", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":30,"index":30}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ImportDeclaration", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":30,"index":30}}, + "importKind": "type", + "specifiers": [ + { + "type": "ImportDefaultSpecifier", + "start":12,"end":18,"loc":{"start":{"line":1,"column":12,"index":12},"end":{"line":1,"column":18,"index":18}}, + "local": { + "type": "Identifier", + "start":12,"end":18,"loc":{"start":{"line":1,"column":12,"index":12},"end":{"line":1,"column":18,"index":18},"identifierName":"switch"}, + "name": "switch" + } + } + ], + "source": { + "type": "StringLiteral", + "start":24,"end":29,"loc":{"start":{"line":1,"column":24,"index":24},"end":{"line":1,"column":29,"index":29}}, + "extra": { + "rawValue": "foo", + "raw": "'foo'" + }, + "value": "foo" + } + } + ], + "directives": [] + } +}