From 5889620a6a9e4a370590b279c4443e0a2f1d6fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 11 Jan 2019 18:59:51 +0100 Subject: [PATCH] Disallow `new import(x)` and `import(x,)` (#9313) * Disallow "new import(...)" * Disallow trailing comma inside dynamic import * Rename test * Update error message --- .../babel-parser/src/parser/expression.js | 21 ++++- .../dynamic-import/invalid-new/input.js | 1 + .../dynamic-import/invalid-new/options.json | 3 + .../invalid-trailing-comma/input.js | 1 + .../invalid-trailing-comma/options.json | 3 + scripts/tests/test262/test262_whitelist.txt | 82 +------------------ 6 files changed, 26 insertions(+), 85 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-new/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-new/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-trailing-comma/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-trailing-comma/options.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 970d4acaf1..fb390e1361 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -596,6 +596,7 @@ export default class ExpressionParser extends LValParser { node.arguments = this.parseCallExpressionArguments( tt.parenR, possibleAsync, + base.type === "Import", ); if (!state.optionalChainMember) { this.finishCallExpression(node); @@ -703,6 +704,7 @@ export default class ExpressionParser extends LValParser { parseCallExpressionArguments( close: TokenType, possibleAsyncArrow: boolean, + dynamicImport?: boolean, ): $ReadOnlyArray { const elts = []; let innerParenStart; @@ -713,7 +715,15 @@ export default class ExpressionParser extends LValParser { first = false; } else { this.expect(tt.comma); - if (this.eat(close)) break; + if (this.eat(close)) { + if (dynamicImport) { + this.raise( + this.state.lastTokStart, + "Trailing comma is disallowed inside import(...) arguments", + ); + } + break; + } } // we need to make sure that if this is an async arrow functions, @@ -1306,7 +1316,10 @@ export default class ExpressionParser extends LValParser { } node.callee = this.parseNoCallExpr(); - if ( + + if (node.callee.type === "Import") { + this.raise(node.callee.start, "Cannot use new with import(...)"); + } else if ( node.callee.type === "OptionalMemberExpression" || node.callee.type === "OptionalCallExpression" ) { @@ -1314,13 +1327,13 @@ export default class ExpressionParser extends LValParser { this.state.lastTokEnd, "constructors in/after an Optional Chain are not allowed", ); - } - if (this.eat(tt.questionDot)) { + } else if (this.eat(tt.questionDot)) { this.raise( this.state.start, "constructors in/after an Optional Chain are not allowed", ); } + this.parseNewArguments(node); return this.finishNode(node, "NewExpression"); } diff --git a/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-new/input.js b/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-new/input.js new file mode 100644 index 0000000000..eb88f1a997 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-new/input.js @@ -0,0 +1 @@ +new import("foo"); diff --git a/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-new/options.json b/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-new/options.json new file mode 100644 index 0000000000..26e64ffc5d --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-new/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Cannot use new with import(...) (1:4)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-trailing-comma/input.js b/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-trailing-comma/input.js new file mode 100644 index 0000000000..6596802add --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-trailing-comma/input.js @@ -0,0 +1 @@ +import("foo",); \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-trailing-comma/options.json b/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-trailing-comma/options.json new file mode 100644 index 0000000000..770750c7f9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/dynamic-import/invalid-trailing-comma/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Trailing comma is disallowed inside import(...) arguments (1:13)" +} diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index e0b544e952..9dbaf7fea2 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -1012,86 +1012,6 @@ language/expressions/class/elements/wrapped-in-sc-rs-private-setter-alt.js(defau language/expressions/class/elements/wrapped-in-sc-rs-private-setter-alt.js(strict mode) language/expressions/class/elements/wrapped-in-sc-rs-private-setter.js(default) language/expressions/class/elements/wrapped-in-sc-rs-private-setter.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-arrow-assignment-expression-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-arrow-assignment-expression-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-arrow-assignment-expression-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-arrow-assignment-expression-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-arrow-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-arrow-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-arrow-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-arrow-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-arrow-function-await-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-arrow-function-await-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-arrow-function-await-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-arrow-function-await-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-arrow-function-return-await-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-arrow-function-return-await-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-arrow-function-return-await-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-arrow-function-return-await-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-await-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-await-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-await-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-await-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-return-await-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-return-await-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-return-await-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-function-return-await-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-gen-await-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-gen-await-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-async-gen-await-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-async-gen-await-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-block-labeled-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-block-labeled-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-block-labeled-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-block-labeled-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-block-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-block-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-block-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-block-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-do-while-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-do-while-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-do-while-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-do-while-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-else-braceless-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-else-braceless-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-else-braceless-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-else-braceless-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-else-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-else-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-else-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-else-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-function-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-function-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-function-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-function-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-function-return-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-function-return-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-function-return-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-function-return-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-if-braceless-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-if-braceless-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-if-braceless-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-if-braceless-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-if-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-if-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-if-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-if-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-while-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-while-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-while-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-while-not-extensible-no-trailing-comma.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/nested-with-expression-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-with-expression-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-with-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/nested-with-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/top-level-no-new-call-expression.js(default) -language/expressions/dynamic-import/syntax/invalid/top-level-no-new-call-expression.js(strict mode) -language/expressions/dynamic-import/syntax/invalid/top-level-not-extensible-no-trailing-comma.js(default) -language/expressions/dynamic-import/syntax/invalid/top-level-not-extensible-no-trailing-comma.js(strict mode) language/expressions/function/dflt-params-duplicates.js(default) language/expressions/generators/dflt-params-duplicates.js(default) language/expressions/object/let-non-strict-access.js(default) @@ -1942,4 +1862,4 @@ language/statements/with/decl-async-fun.js(default) language/statements/with/decl-async-gen.js(default) language/statements/with/labelled-fn-stmt.js(default) language/statements/with/let-block-with-newline.js(default) -language/statements/with/let-identifier-with-newline.js(default) +language/statements/with/let-identifier-with-newline.js(default) \ No newline at end of file