From 7c95240544739198da33f427149df00107a5852b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 17 Sep 2019 02:18:52 +0200 Subject: [PATCH 1/8] Create parser plugin "topLevelAwait" --- .../babel-parser/src/parser/expression.js | 1 + packages/babel-parser/src/parser/statement.js | 6 +- .../top-level-await/export-default/input.js | 1 + .../export-default/options.json | 4 + .../export-default/output.json | 85 +++++++++++ .../top-level-await/for-await-module/input.js | 1 + .../for-await-module/options.json | 4 + .../for-await-module/output.json | 134 +++++++++++++++++ .../top-level-await/for-await-script/input.js | 1 + .../for-await-script/options.json | 5 + .../top-level-await/inside-arrow/input.js | 1 + .../top-level-await/inside-arrow/options.json | 5 + .../top-level-await/inside-block/input.js | 3 + .../top-level-await/inside-block/options.json | 4 + .../top-level-await/inside-block/output.json | 135 ++++++++++++++++++ .../top-level-await/inside-function/input.js | 3 + .../inside-function/options.json | 5 + .../top-level-await/top-level-module/input.js | 1 + .../top-level-module/options.json | 4 + .../top-level-module/output.json | 85 +++++++++++ .../top-level-await/top-level-script/input.js | 1 + .../top-level-script/options.json | 5 + 22 files changed, 489 insertions(+), 5 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-script/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-script/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/inside-arrow/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/inside-arrow/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/inside-function/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/inside-function/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-script/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-script/options.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 556ac6daa7be..991582c89374 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -2208,6 +2208,7 @@ export default class ExpressionParser extends LValParser { isAwaitAllowed(): boolean { if (this.scope.inFunction) return this.scope.inAsync; if (this.options.allowAwaitOutsideFunction) return true; + if (this.hasPlugin("topLevelAwait")) return this.inModule; return false; } diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 81e310debd7b..6d1dbbe5dcb1 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -495,11 +495,7 @@ export default class StatementParser extends ExpressionParser { this.state.labels.push(loopLabel); let awaitAt = -1; - if ( - (this.scope.inAsync || - (!this.scope.inFunction && this.options.allowAwaitOutsideFunction)) && - this.eatContextual("await") - ) { + if (this.isAwaitAllowed() && this.eatContextual("await")) { awaitAt = this.state.lastTokStart; } this.scope.enter(SCOPE_OTHER); diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/input.js new file mode 100644 index 000000000000..fd1dbe08b03f --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/input.js @@ -0,0 +1 @@ +export default await 0; \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/options.json new file mode 100644 index 000000000000..4d7a9975be5a --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "module" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/output.json new file mode 100644 index 000000000000..81e260bd12b2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/export-default/output.json @@ -0,0 +1,85 @@ +{ + "type": "File", + "start": 0, + "end": 23, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 23 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 23, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 23 + } + }, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExportDefaultDeclaration", + "start": 0, + "end": 23, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 23 + } + }, + "declaration": { + "type": "AwaitExpression", + "start": 15, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 15 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "argument": { + "type": "NumericLiteral", + "start": 21, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 21 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/input.js new file mode 100644 index 000000000000..ac76014a6f83 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/input.js @@ -0,0 +1 @@ +for await (const a of b); \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/options.json new file mode 100644 index 000000000000..aadc3411ae9b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "module" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/output.json new file mode 100644 index 000000000000..42be5c156ae8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-module/output.json @@ -0,0 +1,134 @@ +{ + "type": "File", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 25 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 25 + } + }, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ForOfStatement", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 25 + } + }, + "await": true, + "left": { + "type": "VariableDeclaration", + "start": 11, + "end": 18, + "loc": { + "start": { + "line": 1, + "column": 11 + }, + "end": { + "line": 1, + "column": 18 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 17, + "end": 18, + "loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 18 + } + }, + "id": { + "type": "Identifier", + "start": 17, + "end": 18, + "loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 18 + }, + "identifierName": "a" + }, + "name": "a" + }, + "init": null + } + ], + "kind": "const" + }, + "right": { + "type": "Identifier", + "start": 22, + "end": 23, + "loc": { + "start": { + "line": 1, + "column": 22 + }, + "end": { + "line": 1, + "column": 23 + }, + "identifierName": "b" + }, + "name": "b" + }, + "body": { + "type": "EmptyStatement", + "start": 24, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 24 + }, + "end": { + "line": 1, + "column": 25 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-script/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-script/input.js new file mode 100644 index 000000000000..ac76014a6f83 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-script/input.js @@ -0,0 +1 @@ +for await (const a of b); \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-script/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-script/options.json new file mode 100644 index 000000000000..ad8783d13faa --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/for-await-script/options.json @@ -0,0 +1,5 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "script", + "throws": "Unexpected token, expected \"(\" (1:4)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-arrow/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-arrow/input.js new file mode 100644 index 000000000000..bde15d37c8ca --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-arrow/input.js @@ -0,0 +1 @@ +() => await 0; diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-arrow/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-arrow/options.json new file mode 100644 index 000000000000..95eb740f8dfb --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-arrow/options.json @@ -0,0 +1,5 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "module", + "throws": "Can not use keyword 'await' outside an async function (1:6)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/input.js new file mode 100644 index 000000000000..f264b0344b3b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/input.js @@ -0,0 +1,3 @@ +if (true) { + await 0; +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/options.json new file mode 100644 index 000000000000..aadc3411ae9b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "module" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/output.json new file mode 100644 index 000000000000..b70dffe352c1 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-block/output.json @@ -0,0 +1,135 @@ +{ + "type": "File", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "IfStatement", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "test": { + "type": "BooleanLiteral", + "start": 4, + "end": 8, + "loc": { + "start": { + "line": 1, + "column": 4 + }, + "end": { + "line": 1, + "column": 8 + } + }, + "value": true + }, + "consequent": { + "type": "BlockStatement", + "start": 10, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "body": [ + { + "type": "ExpressionStatement", + "start": 14, + "end": 22, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 14, + "end": 21, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 9 + } + }, + "argument": { + "type": "NumericLiteral", + "start": 20, + "end": 21, + "loc": { + "start": { + "line": 2, + "column": 8 + }, + "end": { + "line": 2, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + ], + "directives": [] + }, + "alternate": null + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-function/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-function/input.js new file mode 100644 index 000000000000..ced447b77235 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-function/input.js @@ -0,0 +1,3 @@ +function fn() { + await 0; +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-function/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-function/options.json new file mode 100644 index 000000000000..d09f3f654766 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/inside-function/options.json @@ -0,0 +1,5 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "module", + "throws": "Can not use keyword 'await' outside an async function (2:2)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/input.js new file mode 100644 index 000000000000..d8ddd6c0ad0b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/input.js @@ -0,0 +1 @@ +await 0; \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/options.json new file mode 100644 index 000000000000..aadc3411ae9b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "module" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/output.json new file mode 100644 index 000000000000..02ef8ffabf64 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-module/output.json @@ -0,0 +1,85 @@ +{ + "type": "File", + "start": 0, + "end": 8, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 8 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 8, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 8 + } + }, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 8, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 8 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "argument": { + "type": "NumericLiteral", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-script/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-script/input.js new file mode 100644 index 000000000000..d8ddd6c0ad0b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-script/input.js @@ -0,0 +1 @@ +await 0; \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-script/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-script/options.json new file mode 100644 index 000000000000..c9dc6113fea3 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/top-level-script/options.json @@ -0,0 +1,5 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "script", + "throws": "Unexpected token, expected \";\" (1:6)" +} From 14aa7e49f68edaea37cb7ee3ac634f51799614af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 17 Sep 2019 02:19:03 +0200 Subject: [PATCH 2/8] Update test262 whitelist --- .../test262/run_babel_parser_test262_utils.js | 1 + scripts/tests/test262/test262_whitelist.txt | 452 ------------------ 2 files changed, 1 insertion(+), 452 deletions(-) diff --git a/scripts/tests/test262/run_babel_parser_test262_utils.js b/scripts/tests/test262/run_babel_parser_test262_utils.js index 1434eedfd629..2c35d0ed5933 100644 --- a/scripts/tests/test262/run_babel_parser_test262_utils.js +++ b/scripts/tests/test262/run_babel_parser_test262_utils.js @@ -123,6 +123,7 @@ const featuresToPlugins = { "import.meta": "importMeta", "numeric-separator-literal": "numericSeparator", "optional-chaining": "optionalChaining", + "top-level-await": "topLevelAwait", }; function getPlugins(features) { diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index 8ed606443333..1e21dcd228dc 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -98,458 +98,6 @@ language/module-code/privatename-not-valid-earlyerr-module-3.js(default) language/module-code/privatename-not-valid-earlyerr-module-3.js(strict mode) language/module-code/privatename-not-valid-earlyerr-module-4.js(default) language/module-code/privatename-not-valid-earlyerr-module-4.js(strict mode) -language/module-code/top-level-await/await-awaits-thenable-not-callable.js(default) -language/module-code/top-level-await/await-awaits-thenable-not-callable.js(strict mode) -language/module-code/top-level-await/await-awaits-thenables-that-throw.js(default) -language/module-code/top-level-await/await-awaits-thenables-that-throw.js(strict mode) -language/module-code/top-level-await/await-awaits-thenables.js(default) -language/module-code/top-level-await/await-awaits-thenables.js(strict mode) -language/module-code/top-level-await/await-dynamic-import-rejection.js(default) -language/module-code/top-level-await/await-dynamic-import-rejection.js(strict mode) -language/module-code/top-level-await/await-dynamic-import-resolution.js(default) -language/module-code/top-level-await/await-dynamic-import-resolution.js(strict mode) -language/module-code/top-level-await/await-expr-func-expression.js(default) -language/module-code/top-level-await/await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/await-expr-new-expr-reject.js(default) -language/module-code/top-level-await/await-expr-new-expr-reject.js(strict mode) -language/module-code/top-level-await/await-expr-new-expr.js(default) -language/module-code/top-level-await/await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/await-expr-regexp.js(default) -language/module-code/top-level-await/await-expr-regexp.js(strict mode) -language/module-code/top-level-await/await-expr-reject-throws.js(default) -language/module-code/top-level-await/await-expr-reject-throws.js(strict mode) -language/module-code/top-level-await/await-expr-resolution.js(default) -language/module-code/top-level-await/await-expr-resolution.js(strict mode) -language/module-code/top-level-await/await-void-expr.js(default) -language/module-code/top-level-await/await-void-expr.js(strict mode) -language/module-code/top-level-await/if-await-expr.js(default) -language/module-code/top-level-await/if-await-expr.js(strict mode) -language/module-code/top-level-await/module-async-import-async-resolution-ticks.js(default) -language/module-code/top-level-await/module-async-import-async-resolution-ticks.js(strict mode) -language/module-code/top-level-await/module-import-unwrapped.js(default) -language/module-code/top-level-await/module-import-unwrapped.js(strict mode) -language/module-code/top-level-await/module-self-import-async-resolution-ticks.js(default) -language/module-code/top-level-await/module-self-import-async-resolution-ticks.js(strict mode) -language/module-code/top-level-await/syntax/await-expr-dyn-import.js(default) -language/module-code/top-level-await/syntax/await-expr-dyn-import.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/block-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/block-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/block-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/block-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/block-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/block-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/block-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-null.js(default) -language/module-code/top-level-await/syntax/block-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/block-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/block-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/block-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/block-await-expr-this.js(default) -language/module-code/top-level-await/syntax/block-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/catch-parameter.js(default) -language/module-code/top-level-await/syntax/catch-parameter.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-null.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-this.js(default) -language/module-code/top-level-await/syntax/export-class-decl-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-null.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-this.js(default) -language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-null.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-this.js(default) -language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-null.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-this.js(default) -language/module-code/top-level-await/syntax/export-lex-decl-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-null.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/export-var-await-expr-this.js(default) -language/module-code/top-level-await/syntax/export-var-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-null.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-await-await-expr-this.js(default) -language/module-code/top-level-await/syntax/for-await-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/for-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/for-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/for-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/for-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/for-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/for-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/for-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-null.js(default) -language/module-code/top-level-await/syntax/for-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/for-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/for-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/for-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-await-expr-this.js(default) -language/module-code/top-level-await/syntax/for-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-null.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-in-await-expr-this.js(default) -language/module-code/top-level-await/syntax/for-in-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-null.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/for-of-await-expr-this.js(default) -language/module-code/top-level-await/syntax/for-of-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-null.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/if-block-await-expr-this.js(default) -language/module-code/top-level-await/syntax/if-block-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-null.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/if-expr-await-expr-this.js(default) -language/module-code/top-level-await/syntax/if-expr-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-null.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/top-level-await-expr-this.js(default) -language/module-code/top-level-await/syntax/top-level-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/try-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/try-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/try-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/try-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/try-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/try-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/try-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-null.js(default) -language/module-code/top-level-await/syntax/try-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/try-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/try-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/try-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/try-await-expr-this.js(default) -language/module-code/top-level-await/syntax/try-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-null.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/typeof-await-expr-this.js(default) -language/module-code/top-level-await/syntax/typeof-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/void-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/void-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/void-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/void-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/void-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/void-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/void-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-null.js(default) -language/module-code/top-level-await/syntax/void-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/void-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/void-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/void-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/void-await-expr-this.js(default) -language/module-code/top-level-await/syntax/void-await-expr-this.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-array-literal.js(default) -language/module-code/top-level-await/syntax/while-await-expr-array-literal.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-func-expression.js(default) -language/module-code/top-level-await/syntax/while-await-expr-func-expression.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-identifier.js(default) -language/module-code/top-level-await/syntax/while-await-expr-identifier.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-literal-number.js(default) -language/module-code/top-level-await/syntax/while-await-expr-literal-number.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-literal-string.js(default) -language/module-code/top-level-await/syntax/while-await-expr-literal-string.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-nested.js(default) -language/module-code/top-level-await/syntax/while-await-expr-nested.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-new-expr.js(default) -language/module-code/top-level-await/syntax/while-await-expr-new-expr.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-null.js(default) -language/module-code/top-level-await/syntax/while-await-expr-null.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-obj-literal.js(default) -language/module-code/top-level-await/syntax/while-await-expr-obj-literal.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-regexp.js(default) -language/module-code/top-level-await/syntax/while-await-expr-regexp.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-template-literal.js(default) -language/module-code/top-level-await/syntax/while-await-expr-template-literal.js(strict mode) -language/module-code/top-level-await/syntax/while-await-expr-this.js(default) -language/module-code/top-level-await/syntax/while-await-expr-this.js(strict mode) -language/module-code/top-level-await/top-level-ticks-2.js(default) -language/module-code/top-level-await/top-level-ticks-2.js(strict mode) -language/module-code/top-level-await/top-level-ticks.js(default) -language/module-code/top-level-await/top-level-ticks.js(strict mode) -language/module-code/top-level-await/void-await-expr.js(default) -language/module-code/top-level-await/void-await-expr.js(strict mode) -language/module-code/top-level-await/while-dynamic-evaluation.js(default) -language/module-code/top-level-await/while-dynamic-evaluation.js(strict mode) language/statements/class/elements/fields-duplicate-privatenames.js(default) language/statements/class/elements/fields-duplicate-privatenames.js(strict mode) language/statements/class/elements/privatename-not-valid-earlyerr-script-1.js(default) From 9a16a3e5adc147433dff2644490b1aa2e5159c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 17 Sep 2019 02:21:19 +0200 Subject: [PATCH 3/8] Update ts typings --- packages/babel-parser/typings/babel-parser.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/babel-parser/typings/babel-parser.d.ts b/packages/babel-parser/typings/babel-parser.d.ts index 371b9a4633da..9f2be7489e53 100644 --- a/packages/babel-parser/typings/babel-parser.d.ts +++ b/packages/babel-parser/typings/babel-parser.d.ts @@ -123,6 +123,7 @@ export type ParserPlugin = 'pipelineOperator' | 'placeholders' | 'throwExpressions' | + 'topLevelAwait' | 'typescript' | 'v8intrinsic' | ParserPluginWithOptions; From 94cfa86d01c909aa8143b4bf877fbc2eb837d72d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 18 Oct 2019 11:01:05 +0200 Subject: [PATCH 4/8] Fix "sourceType: unambiguous" with TLA --- packages/babel-parser/src/index.js | 25 ++++- packages/babel-parser/src/parser/base.js | 1 + .../babel-parser/src/parser/expression.js | 9 ++ .../input.js | 1 + .../options.json | 5 + .../output.json | 85 +++++++++++++++ .../unambiguous-ambiguous-script/input.js | 2 + .../unambiguous-ambiguous-script/options.json | 4 + .../unambiguous-ambiguous-script/output.json | 102 ++++++++++++++++++ .../unambiguous-module/input.js | 1 + .../unambiguous-module/options.json | 4 + .../unambiguous-module/output.json | 85 +++++++++++++++ 12 files changed, 320 insertions(+), 4 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/output.json diff --git a/packages/babel-parser/src/index.js b/packages/babel-parser/src/index.js index d9f812695545..005a2d736cf4 100755 --- a/packages/babel-parser/src/index.js +++ b/packages/babel-parser/src/index.js @@ -25,15 +25,32 @@ export function parse(input: string, options?: Options): File { const parser = getParser(options, input); const ast = parser.parse(); - // Rather than try to parse as a script first, we opt to parse as a module and convert back - // to a script where possible to avoid having to do a full re-parse of the input content. - if (!parser.sawUnambiguousESM) ast.program.sourceType = "script"; + if (parser.sawUnambiguousESM) { + return ast; + } + + if (parser.ambiguousScriptDifferentAst) { + // Top level await introduces code which can be both a valid script and + // a valid module, but which produces different ASTs: + // await + // 0 + // can be parser either as an AwaitExpression, or as two ExpressionStatements. + try { + options.sourceType = "script"; + return getParser(options, input).parse(); + } catch {} + } else { + // This is both a valid module and a valid script, but + // we parse it as a script by default + ast.program.sourceType = "script"; + } + return ast; } catch (moduleError) { try { options.sourceType = "script"; return getParser(options, input).parse(); - } catch (scriptError) {} + } catch {} throw moduleError; } diff --git a/packages/babel-parser/src/parser/base.js b/packages/babel-parser/src/parser/base.js index 1e451794158c..f4fb9f3b66e0 100644 --- a/packages/babel-parser/src/parser/base.js +++ b/packages/babel-parser/src/parser/base.js @@ -13,6 +13,7 @@ export default class BaseParser { plugins: PluginsMap; filename: ?string; sawUnambiguousESM: boolean = false; + ambiguousScriptDifferentAst: boolean = false; // Initialized by Tokenizer state: State; diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 991582c89374..dd277260f092 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -2235,9 +2235,18 @@ export default class ExpressionParser extends LValParser { ); } + if (!this.scope.inFunction && !this.options.allowAwaitOutsideFunction) { + if (this.hasPrecedingLineBreak()) { + this.ambiguousScriptDifferentAst = true; + } else { + this.sawUnambiguousESM = true; + } + } + if (!this.state.soloAwait) { node.argument = this.parseMaybeUnary(); } + return this.finishNode(node, "AwaitExpression"); } diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/input.js new file mode 100644 index 000000000000..34723bac4ae7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/input.js @@ -0,0 +1 @@ +await 0 \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/options.json new file mode 100644 index 000000000000..aceca10c3d74 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/options.json @@ -0,0 +1,5 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "unambiguous", + "allowAwaitOutsideFunction": true +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/output.json new file mode 100644 index 000000000000..1dab4defe2b8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/output.json @@ -0,0 +1,85 @@ +{ + "type": "File", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "argument": { + "type": "NumericLiteral", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/input.js new file mode 100644 index 000000000000..9a32f9264db2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/input.js @@ -0,0 +1,2 @@ +await +0 \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/options.json new file mode 100644 index 000000000000..2503b82adf74 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "unambiguous" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/output.json new file mode 100644 index 000000000000..f22c73c95d00 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/output.json @@ -0,0 +1,102 @@ +{ + "type": "File", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 1 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 5, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 5 + } + }, + "expression": { + "type": "Identifier", + "start": 0, + "end": 5, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 5 + }, + "identifierName": "await" + }, + "name": "await" + } + }, + { + "type": "ExpressionStatement", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 1 + } + }, + "expression": { + "type": "NumericLiteral", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 1 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/input.js new file mode 100644 index 000000000000..34723bac4ae7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/input.js @@ -0,0 +1 @@ +await 0 \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/options.json new file mode 100644 index 000000000000..2503b82adf74 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "unambiguous" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/output.json new file mode 100644 index 000000000000..f0d3c6ce6ac7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/output.json @@ -0,0 +1,85 @@ +{ + "type": "File", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 0, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "argument": { + "type": "NumericLiteral", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file From be801701d4c5a2d1445b5f41207beb0e5ca3fecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 22 Oct 2019 01:45:56 +0200 Subject: [PATCH 5/8] Ambiguous tokens after await --- .../babel-parser/src/parser/expression.js | 18 +- .../input.js | 8 +- .../output.json | 315 +++++++++++++- .../unambiguous-ambiguous-script/input.js | 8 +- .../unambiguous-ambiguous-script/output.json | 386 +++++++++++++++++- .../unambiguous-module/input.js | 8 +- .../unambiguous-module/output.json | 315 +++++++++++++- 7 files changed, 1036 insertions(+), 22 deletions(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index dd277260f092..9637b6dee27c 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -2236,7 +2236,23 @@ export default class ExpressionParser extends LValParser { } if (!this.scope.inFunction && !this.options.allowAwaitOutsideFunction) { - if (this.hasPrecedingLineBreak()) { + if ( + this.hasPrecedingLineBreak() || + // All the following expressions are ambiguous: + // await + 0 + // await - 0 + // await ( 0 ) + // await [ 0 ] + // await / 0 /u + this.match(tt.plusMin) || + this.match(tt.parenL) || + this.match(tt.bracketL) || + this.match(tt.backQuote) || + // Sometimes the tokenizer generates tt.slach for regexps, and this is + // handler by parseExprAtom + this.match(tt.regexp) || + this.match(tt.slash) + ) { this.ambiguousScriptDifferentAst = true; } else { this.sawUnambiguousESM = true; diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/input.js index 34723bac4ae7..1fa05e429c67 100644 --- a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/input.js +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/input.js @@ -1 +1,7 @@ -await 0 \ No newline at end of file +await 0 + +await + 0 +await - 0 +await ( 0 ) +await [ 0 ] +await / 0 /u diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/output.json index 1dab4defe2b8..76e30779fc90 100644 --- a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/output.json +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-allowAwaitOutsideFunction/output.json @@ -1,29 +1,29 @@ { "type": "File", "start": 0, - "end": 7, + "end": 65, "loc": { "start": { "line": 1, "column": 0 }, "end": { - "line": 1, - "column": 7 + "line": 7, + "column": 12 } }, "program": { "type": "Program", "start": 0, - "end": 7, + "end": 65, "loc": { "start": { "line": 1, "column": 0 }, "end": { - "line": 1, - "column": 7 + "line": 7, + "column": 12 } }, "sourceType": "script", @@ -78,6 +78,309 @@ "value": 0 } } + }, + { + "type": "ExpressionStatement", + "start": 9, + "end": 18, + "loc": { + "start": { + "line": 3, + "column": 0 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 9, + "end": 18, + "loc": { + "start": { + "line": 3, + "column": 0 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "argument": { + "type": "UnaryExpression", + "start": 15, + "end": 18, + "loc": { + "start": { + "line": 3, + "column": 6 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "operator": "+", + "prefix": true, + "argument": { + "type": "NumericLiteral", + "start": 17, + "end": 18, + "loc": { + "start": { + "line": 3, + "column": 8 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + }, + { + "type": "ExpressionStatement", + "start": 19, + "end": 28, + "loc": { + "start": { + "line": 4, + "column": 0 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 19, + "end": 28, + "loc": { + "start": { + "line": 4, + "column": 0 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "argument": { + "type": "UnaryExpression", + "start": 25, + "end": 28, + "loc": { + "start": { + "line": 4, + "column": 6 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "operator": "-", + "prefix": true, + "argument": { + "type": "NumericLiteral", + "start": 27, + "end": 28, + "loc": { + "start": { + "line": 4, + "column": 8 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + }, + { + "type": "ExpressionStatement", + "start": 29, + "end": 40, + "loc": { + "start": { + "line": 5, + "column": 0 + }, + "end": { + "line": 5, + "column": 11 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 29, + "end": 40, + "loc": { + "start": { + "line": 5, + "column": 0 + }, + "end": { + "line": 5, + "column": 11 + } + }, + "argument": { + "type": "NumericLiteral", + "start": 37, + "end": 38, + "loc": { + "start": { + "line": 5, + "column": 8 + }, + "end": { + "line": 5, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0", + "parenthesized": true, + "parenStart": 35 + }, + "value": 0 + } + } + }, + { + "type": "ExpressionStatement", + "start": 41, + "end": 52, + "loc": { + "start": { + "line": 6, + "column": 0 + }, + "end": { + "line": 6, + "column": 11 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 41, + "end": 52, + "loc": { + "start": { + "line": 6, + "column": 0 + }, + "end": { + "line": 6, + "column": 11 + } + }, + "argument": { + "type": "ArrayExpression", + "start": 47, + "end": 52, + "loc": { + "start": { + "line": 6, + "column": 6 + }, + "end": { + "line": 6, + "column": 11 + } + }, + "elements": [ + { + "type": "NumericLiteral", + "start": 49, + "end": 50, + "loc": { + "start": { + "line": 6, + "column": 8 + }, + "end": { + "line": 6, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + ] + } + } + }, + { + "type": "ExpressionStatement", + "start": 53, + "end": 65, + "loc": { + "start": { + "line": 7, + "column": 0 + }, + "end": { + "line": 7, + "column": 12 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 53, + "end": 65, + "loc": { + "start": { + "line": 7, + "column": 0 + }, + "end": { + "line": 7, + "column": 12 + } + }, + "argument": { + "type": "RegExpLiteral", + "start": 59, + "end": 65, + "loc": { + "start": { + "line": 7, + "column": 6 + }, + "end": { + "line": 7, + "column": 12 + } + }, + "extra": { + "raw": "/ 0 /u" + }, + "pattern": " 0 ", + "flags": "u" + } + } } ], "directives": [] diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/input.js index 9a32f9264db2..9fac4af0f0aa 100644 --- a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/input.js +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/input.js @@ -1,2 +1,8 @@ await -0 \ No newline at end of file +0 + +await + 0 +await - 0 +await ( 0 ) +await [ 0 ] +await / 0 /u diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/output.json index f22c73c95d00..76a211cbb464 100644 --- a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/output.json +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-script/output.json @@ -1,29 +1,29 @@ { "type": "File", "start": 0, - "end": 7, + "end": 65, "loc": { "start": { "line": 1, "column": 0 }, "end": { - "line": 2, - "column": 1 + "line": 8, + "column": 12 } }, "program": { "type": "Program", "start": 0, - "end": 7, + "end": 65, "loc": { "start": { "line": 1, "column": 0 }, "end": { - "line": 2, - "column": 1 + "line": 8, + "column": 12 } }, "sourceType": "script", @@ -95,6 +95,380 @@ }, "value": 0 } + }, + { + "type": "ExpressionStatement", + "start": 9, + "end": 18, + "loc": { + "start": { + "line": 4, + "column": 0 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "expression": { + "type": "BinaryExpression", + "start": 9, + "end": 18, + "loc": { + "start": { + "line": 4, + "column": 0 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "left": { + "type": "Identifier", + "start": 9, + "end": 14, + "loc": { + "start": { + "line": 4, + "column": 0 + }, + "end": { + "line": 4, + "column": 5 + }, + "identifierName": "await" + }, + "name": "await" + }, + "operator": "+", + "right": { + "type": "NumericLiteral", + "start": 17, + "end": 18, + "loc": { + "start": { + "line": 4, + "column": 8 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + }, + { + "type": "ExpressionStatement", + "start": 19, + "end": 28, + "loc": { + "start": { + "line": 5, + "column": 0 + }, + "end": { + "line": 5, + "column": 9 + } + }, + "expression": { + "type": "BinaryExpression", + "start": 19, + "end": 28, + "loc": { + "start": { + "line": 5, + "column": 0 + }, + "end": { + "line": 5, + "column": 9 + } + }, + "left": { + "type": "Identifier", + "start": 19, + "end": 24, + "loc": { + "start": { + "line": 5, + "column": 0 + }, + "end": { + "line": 5, + "column": 5 + }, + "identifierName": "await" + }, + "name": "await" + }, + "operator": "-", + "right": { + "type": "NumericLiteral", + "start": 27, + "end": 28, + "loc": { + "start": { + "line": 5, + "column": 8 + }, + "end": { + "line": 5, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + }, + { + "type": "ExpressionStatement", + "start": 29, + "end": 40, + "loc": { + "start": { + "line": 6, + "column": 0 + }, + "end": { + "line": 6, + "column": 11 + } + }, + "expression": { + "type": "CallExpression", + "start": 29, + "end": 40, + "loc": { + "start": { + "line": 6, + "column": 0 + }, + "end": { + "line": 6, + "column": 11 + } + }, + "callee": { + "type": "Identifier", + "start": 29, + "end": 34, + "loc": { + "start": { + "line": 6, + "column": 0 + }, + "end": { + "line": 6, + "column": 5 + }, + "identifierName": "await" + }, + "name": "await" + }, + "arguments": [ + { + "type": "NumericLiteral", + "start": 37, + "end": 38, + "loc": { + "start": { + "line": 6, + "column": 8 + }, + "end": { + "line": 6, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + ] + } + }, + { + "type": "ExpressionStatement", + "start": 41, + "end": 52, + "loc": { + "start": { + "line": 7, + "column": 0 + }, + "end": { + "line": 7, + "column": 11 + } + }, + "expression": { + "type": "MemberExpression", + "start": 41, + "end": 52, + "loc": { + "start": { + "line": 7, + "column": 0 + }, + "end": { + "line": 7, + "column": 11 + } + }, + "object": { + "type": "Identifier", + "start": 41, + "end": 46, + "loc": { + "start": { + "line": 7, + "column": 0 + }, + "end": { + "line": 7, + "column": 5 + }, + "identifierName": "await" + }, + "name": "await" + }, + "property": { + "type": "NumericLiteral", + "start": 49, + "end": 50, + "loc": { + "start": { + "line": 7, + "column": 8 + }, + "end": { + "line": 7, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + }, + "computed": true + } + }, + { + "type": "ExpressionStatement", + "start": 53, + "end": 65, + "loc": { + "start": { + "line": 8, + "column": 0 + }, + "end": { + "line": 8, + "column": 12 + } + }, + "expression": { + "type": "BinaryExpression", + "start": 53, + "end": 65, + "loc": { + "start": { + "line": 8, + "column": 0 + }, + "end": { + "line": 8, + "column": 12 + } + }, + "left": { + "type": "BinaryExpression", + "start": 53, + "end": 62, + "loc": { + "start": { + "line": 8, + "column": 0 + }, + "end": { + "line": 8, + "column": 9 + } + }, + "left": { + "type": "Identifier", + "start": 53, + "end": 58, + "loc": { + "start": { + "line": 8, + "column": 0 + }, + "end": { + "line": 8, + "column": 5 + }, + "identifierName": "await" + }, + "name": "await" + }, + "operator": "/", + "right": { + "type": "NumericLiteral", + "start": 61, + "end": 62, + "loc": { + "start": { + "line": 8, + "column": 8 + }, + "end": { + "line": 8, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + }, + "operator": "/", + "right": { + "type": "Identifier", + "start": 64, + "end": 65, + "loc": { + "start": { + "line": 8, + "column": 11 + }, + "end": { + "line": 8, + "column": 12 + }, + "identifierName": "u" + }, + "name": "u" + } + } } ], "directives": [] diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/input.js index 34723bac4ae7..1fa05e429c67 100644 --- a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/input.js +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/input.js @@ -1 +1,7 @@ -await 0 \ No newline at end of file +await 0 + +await + 0 +await - 0 +await ( 0 ) +await [ 0 ] +await / 0 /u diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/output.json index f0d3c6ce6ac7..18617474f20a 100644 --- a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/output.json +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-module/output.json @@ -1,29 +1,29 @@ { "type": "File", "start": 0, - "end": 7, + "end": 65, "loc": { "start": { "line": 1, "column": 0 }, "end": { - "line": 1, - "column": 7 + "line": 7, + "column": 12 } }, "program": { "type": "Program", "start": 0, - "end": 7, + "end": 65, "loc": { "start": { "line": 1, "column": 0 }, "end": { - "line": 1, - "column": 7 + "line": 7, + "column": 12 } }, "sourceType": "module", @@ -78,6 +78,309 @@ "value": 0 } } + }, + { + "type": "ExpressionStatement", + "start": 9, + "end": 18, + "loc": { + "start": { + "line": 3, + "column": 0 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 9, + "end": 18, + "loc": { + "start": { + "line": 3, + "column": 0 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "argument": { + "type": "UnaryExpression", + "start": 15, + "end": 18, + "loc": { + "start": { + "line": 3, + "column": 6 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "operator": "+", + "prefix": true, + "argument": { + "type": "NumericLiteral", + "start": 17, + "end": 18, + "loc": { + "start": { + "line": 3, + "column": 8 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + }, + { + "type": "ExpressionStatement", + "start": 19, + "end": 28, + "loc": { + "start": { + "line": 4, + "column": 0 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 19, + "end": 28, + "loc": { + "start": { + "line": 4, + "column": 0 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "argument": { + "type": "UnaryExpression", + "start": 25, + "end": 28, + "loc": { + "start": { + "line": 4, + "column": 6 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "operator": "-", + "prefix": true, + "argument": { + "type": "NumericLiteral", + "start": 27, + "end": 28, + "loc": { + "start": { + "line": 4, + "column": 8 + }, + "end": { + "line": 4, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + }, + { + "type": "ExpressionStatement", + "start": 29, + "end": 40, + "loc": { + "start": { + "line": 5, + "column": 0 + }, + "end": { + "line": 5, + "column": 11 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 29, + "end": 40, + "loc": { + "start": { + "line": 5, + "column": 0 + }, + "end": { + "line": 5, + "column": 11 + } + }, + "argument": { + "type": "NumericLiteral", + "start": 37, + "end": 38, + "loc": { + "start": { + "line": 5, + "column": 8 + }, + "end": { + "line": 5, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0", + "parenthesized": true, + "parenStart": 35 + }, + "value": 0 + } + } + }, + { + "type": "ExpressionStatement", + "start": 41, + "end": 52, + "loc": { + "start": { + "line": 6, + "column": 0 + }, + "end": { + "line": 6, + "column": 11 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 41, + "end": 52, + "loc": { + "start": { + "line": 6, + "column": 0 + }, + "end": { + "line": 6, + "column": 11 + } + }, + "argument": { + "type": "ArrayExpression", + "start": 47, + "end": 52, + "loc": { + "start": { + "line": 6, + "column": 6 + }, + "end": { + "line": 6, + "column": 11 + } + }, + "elements": [ + { + "type": "NumericLiteral", + "start": 49, + "end": 50, + "loc": { + "start": { + "line": 6, + "column": 8 + }, + "end": { + "line": 6, + "column": 9 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + ] + } + } + }, + { + "type": "ExpressionStatement", + "start": 53, + "end": 65, + "loc": { + "start": { + "line": 7, + "column": 0 + }, + "end": { + "line": 7, + "column": 12 + } + }, + "expression": { + "type": "AwaitExpression", + "start": 53, + "end": 65, + "loc": { + "start": { + "line": 7, + "column": 0 + }, + "end": { + "line": 7, + "column": 12 + } + }, + "argument": { + "type": "RegExpLiteral", + "start": 59, + "end": 65, + "loc": { + "start": { + "line": 7, + "column": 6 + }, + "end": { + "line": 7, + "column": 12 + } + }, + "extra": { + "raw": "/ 0 /u" + }, + "pattern": " 0 ", + "flags": "u" + } + } } ], "directives": [] From fd83281c200be797cd9fb9a3f764a216d9740b84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 22 Oct 2019 11:09:08 +0200 Subject: [PATCH 6/8] Update await %x(0) --- .../babel-parser/src/parser/expression.js | 13 +- .../unambiguous-ambiguous-modulo/input.js | 1 + .../unambiguous-ambiguous-modulo/options.json | 4 + .../unambiguous-ambiguous-modulo/output.json | 137 ++++++++++++++++++ .../input.js | 1 + .../options.json | 4 + .../output.json | 137 ++++++++++++++++++ 7 files changed, 290 insertions(+), 7 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/output.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 9637b6dee27c..373e28936067 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -2239,19 +2239,18 @@ export default class ExpressionParser extends LValParser { if ( this.hasPrecedingLineBreak() || // All the following expressions are ambiguous: - // await + 0 - // await - 0 - // await ( 0 ) - // await [ 0 ] - // await / 0 /u + // await + 0, await - 0, await ( 0 ), await [ 0 ], await / 0 /u, await `` this.match(tt.plusMin) || this.match(tt.parenL) || this.match(tt.bracketL) || this.match(tt.backQuote) || - // Sometimes the tokenizer generates tt.slach for regexps, and this is + // Sometimes the tokenizer generates tt.slash for regexps, and this is // handler by parseExprAtom this.match(tt.regexp) || - this.match(tt.slash) + this.match(tt.slash) || + // This code couls be parsed both as a modulo operator or as an intrinsic: + // await %x(0) + (this.hasPlugin("v8intrinsic") && this.match(tt.modulo)) ) { this.ambiguousScriptDifferentAst = true; } else { diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/input.js new file mode 100644 index 000000000000..735a0162b362 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/input.js @@ -0,0 +1 @@ +await %x(0) \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/options.json new file mode 100644 index 000000000000..2503b82adf74 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["topLevelAwait"], + "sourceType": "unambiguous" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/output.json new file mode 100644 index 000000000000..5805e3195560 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-modulo/output.json @@ -0,0 +1,137 @@ +{ + "type": "File", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "expression": { + "type": "BinaryExpression", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "left": { + "type": "Identifier", + "start": 0, + "end": 5, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 5 + }, + "identifierName": "await" + }, + "name": "await" + }, + "operator": "%", + "right": { + "type": "CallExpression", + "start": 7, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "callee": { + "type": "Identifier", + "start": 7, + "end": 8, + "loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 8 + }, + "identifierName": "x" + }, + "name": "x" + }, + "arguments": [ + { + "type": "NumericLiteral", + "start": 9, + "end": 10, + "loc": { + "start": { + "line": 1, + "column": 9 + }, + "end": { + "line": 1, + "column": 10 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + ] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/input.js b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/input.js new file mode 100644 index 000000000000..735a0162b362 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/input.js @@ -0,0 +1 @@ +await %x(0) \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/options.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/options.json new file mode 100644 index 000000000000..6732f5f2f093 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["topLevelAwait", "v8intrinsic"], + "sourceType": "unambiguous" +} diff --git a/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/output.json b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/output.json new file mode 100644 index 000000000000..5805e3195560 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/top-level-await/unambiguous-ambiguous-v8intrinsinc/output.json @@ -0,0 +1,137 @@ +{ + "type": "File", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "expression": { + "type": "BinaryExpression", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "left": { + "type": "Identifier", + "start": 0, + "end": 5, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 5 + }, + "identifierName": "await" + }, + "name": "await" + }, + "operator": "%", + "right": { + "type": "CallExpression", + "start": 7, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "callee": { + "type": "Identifier", + "start": 7, + "end": 8, + "loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 8 + }, + "identifierName": "x" + }, + "name": "x" + }, + "arguments": [ + { + "type": "NumericLiteral", + "start": 9, + "end": 10, + "loc": { + "start": { + "line": 1, + "column": 9 + }, + "end": { + "line": 1, + "column": 10 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + ] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file From b73f31cf0efa631e3ed0641a00697fe1b96b9f36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 26 Oct 2019 11:47:28 +0200 Subject: [PATCH 7/8] typo [skip ci] --- packages/babel-parser/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-parser/src/index.js b/packages/babel-parser/src/index.js index 005a2d736cf4..3e9696b858fc 100755 --- a/packages/babel-parser/src/index.js +++ b/packages/babel-parser/src/index.js @@ -34,7 +34,7 @@ export function parse(input: string, options?: Options): File { // a valid module, but which produces different ASTs: // await // 0 - // can be parser either as an AwaitExpression, or as two ExpressionStatements. + // can be parsed either as an AwaitExpression, or as two ExpressionStatements. try { options.sourceType = "script"; return getParser(options, input).parse(); From c3d892e33a83d67d648e451c2631d4a2a1f22c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 29 Oct 2019 22:18:27 +0100 Subject: [PATCH 8/8] Typo [skip ci] Co-Authored-By: Brian Ng --- packages/babel-parser/src/parser/expression.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 373e28936067..04299e439830 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -2248,7 +2248,7 @@ export default class ExpressionParser extends LValParser { // handler by parseExprAtom this.match(tt.regexp) || this.match(tt.slash) || - // This code couls be parsed both as a modulo operator or as an intrinsic: + // This code could be parsed both as a modulo operator or as an intrinsic: // await %x(0) (this.hasPlugin("v8intrinsic") && this.match(tt.modulo)) ) {