From 8071dca9ad8bcc9064c3183ae9ae5b8a142785cf Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Mon, 21 Jan 2019 23:38:27 -0800 Subject: [PATCH] Disallow `const let` or `let let` --- packages/babel-parser/src/parser/statement.js | 7 +++++-- packages/babel-parser/src/plugins/flow.js | 7 +++++-- packages/babel-parser/src/plugins/typescript.js | 7 +++++-- scripts/tests/test262/test262_whitelist.txt | 4 ---- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index fcc2ad23a9..cdfd8313c5 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -907,7 +907,7 @@ export default class StatementParser extends ExpressionParser { node.kind = kind; for (;;) { const decl = this.startNode(); - this.parseVarHead(decl); + this.parseVarId(decl, kind); if (this.eat(tt.eq)) { decl.init = this.parseMaybeAssign(isFor); } else { @@ -937,7 +937,10 @@ export default class StatementParser extends ExpressionParser { return node; } - parseVarHead(decl: N.VariableDeclarator): void { + parseVarId(decl: N.VariableDeclarator, kind: "var" | "let" | "const"): void { + if ((kind === "const" || kind === "let") && this.isContextual("let")) { + this.unexpected(null, "let is disallowed as a lexically bound name"); + } decl.id = this.parseBindingAtom(); this.checkLVal(decl.id, true, undefined, "variable declaration"); } diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index e45ddd6b29..912bb09c5f 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -2344,8 +2344,11 @@ export default (superClass: Class): Class => } // parse flow type annotations on variable declarator heads - let foo: string = bar - parseVarHead(decl: N.VariableDeclarator): void { - super.parseVarHead(decl); + parseVarId( + decl: N.VariableDeclarator, + kind: "var" | "let" | "const", + ): void { + super.parseVarId(decl, kind); if (this.match(tt.colon)) { decl.id.typeAnnotation = this.flowParseTypeAnnotation(); this.finishNode(decl.id, decl.id.type); diff --git a/packages/babel-parser/src/plugins/typescript.js b/packages/babel-parser/src/plugins/typescript.js index 80e74859c4..3afd592038 100644 --- a/packages/babel-parser/src/plugins/typescript.js +++ b/packages/babel-parser/src/plugins/typescript.js @@ -1948,8 +1948,11 @@ export default (superClass: Class): Class => } // `let x: number;` - parseVarHead(decl: N.VariableDeclarator): void { - super.parseVarHead(decl); + parseVarId( + decl: N.VariableDeclarator, + kind: "var" | "let" | "const", + ): void { + super.parseVarId(decl, kind); if (decl.id.type === "Identifier" && this.eat(tt.bang)) { decl.definite = true; } diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index 5211810741..51e4a19de6 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -672,8 +672,6 @@ language/expressions/async-generator/early-errors-expression-formals-body-duplic language/expressions/async-generator/early-errors-expression-formals-body-duplicate-let.js(default) language/expressions/async-generator/early-errors-expression-formals-body-duplicate-let.js(strict mode) language/expressions/async-generator/named-dflt-params-duplicates.js(default) -language/expressions/class/class-name-ident-static-escaped.js(default) -language/expressions/class/class-name-ident-static.js(default) language/expressions/class/elements/fields-duplicate-privatenames.js(default) language/expressions/class/elements/fields-duplicate-privatenames.js(strict mode) language/expressions/class/elements/fields-literal-name-static-propname-constructor.js(default) @@ -1029,8 +1027,6 @@ language/statements/class/async-gen-meth-escaped-async.js(default) language/statements/class/async-gen-meth-escaped-async.js(strict mode) language/statements/class/async-meth-escaped-async.js(default) language/statements/class/async-meth-escaped-async.js(strict mode) -language/statements/class/class-name-ident-static-escaped.js(default) -language/statements/class/class-name-ident-static.js(default) language/statements/class/elements/fields-duplicate-privatenames.js(default) language/statements/class/elements/fields-duplicate-privatenames.js(strict mode) language/statements/class/elements/fields-literal-name-static-propname-constructor.js(default)