Disallow new import(x) and import(x,) (#9313)

* Disallow "new import(...)"

* Disallow trailing comma inside dynamic import

* Rename test

* Update error message
This commit is contained in:
Nicolò Ribaudo
2019-01-11 18:59:51 +01:00
committed by GitHub
parent 9764718c32
commit 5889620a6a
6 changed files with 26 additions and 85 deletions

View File

@@ -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<?N.Expression> {
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");
}

View File

@@ -0,0 +1 @@
new import("foo");

View File

@@ -0,0 +1,3 @@
{
"throws": "Cannot use new with import(...) (1:4)"
}

View File

@@ -0,0 +1 @@
import("foo",);

View File

@@ -0,0 +1,3 @@
{
"throws": "Trailing comma is disallowed inside import(...) arguments (1:13)"
}

View File

@@ -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)