diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 9bc8851827e5..6db4f9d61bbd 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -188,7 +188,13 @@ export default class StatementParser extends ExpressionParser { // Statement) is allowed here. If context is not empty then only a Statement // is allowed. However, `let [` is an explicit negative lookahead for // ExpressionStatement, so special-case it first. - if (nextCh === charCodes.leftSquareBracket) return true; + // Also, `let \` is never valid as an expression so this must be a keyword. + if ( + nextCh === charCodes.backslash || + nextCh === charCodes.leftSquareBracket + ) { + return true; + } if (context) return false; if (nextCh === charCodes.leftCurlyBrace) return true; diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-declaration-escape-id/input.js b/packages/babel-parser/test/fixtures/es2015/let/let-declaration-escape-id/input.js new file mode 100644 index 000000000000..5328e3d1bef3 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-declaration-escape-id/input.js @@ -0,0 +1 @@ +let \u0275ResourceLoaderImpl_BaseFactory diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-declaration-escape-id/output.json b/packages/babel-parser/test/fixtures/es2015/let/let-declaration-escape-id/output.json new file mode 100644 index 000000000000..5728eaa418a4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-declaration-escape-id/output.json @@ -0,0 +1,30 @@ +{ + "type": "File", + "start":0,"end":40,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}}, + "program": { + "type": "Program", + "start":0,"end":40,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":40,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":40,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":40}}, + "id": { + "type": "Identifier", + "start":4,"end":40,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":40},"identifierName":"ɵResourceLoaderImpl_BaseFactory"}, + "name": "ɵResourceLoaderImpl_BaseFactory" + }, + "init": null + } + ], + "kind": "let" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-expression-followed-by-escape/input.js b/packages/babel-parser/test/fixtures/es2015/let/let-expression-followed-by-escape/input.js new file mode 100644 index 000000000000..44cd64e57963 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-expression-followed-by-escape/input.js @@ -0,0 +1,2 @@ +1 + let +\u0275ResourceLoaderImpl_BaseFactory diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-expression-followed-by-escape/output.json b/packages/babel-parser/test/fixtures/es2015/let/let-expression-followed-by-escape/output.json new file mode 100644 index 000000000000..80c9238253f7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-expression-followed-by-escape/output.json @@ -0,0 +1,45 @@ +{ + "type": "File", + "start":0,"end":44,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":36}}, + "program": { + "type": "Program", + "start":0,"end":44,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":36}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":7,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":7}}, + "expression": { + "type": "BinaryExpression", + "start":0,"end":7,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":7}}, + "left": { + "type": "NumericLiteral", + "start":0,"end":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":1}}, + "extra": { + "rawValue": 1, + "raw": "1" + }, + "value": 1 + }, + "operator": "+", + "right": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"let"}, + "name": "let" + } + } + }, + { + "type": "ExpressionStatement", + "start":8,"end":44,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":36}}, + "expression": { + "type": "Identifier", + "start":8,"end":44,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":36},"identifierName":"ɵResourceLoaderImpl_BaseFactory"}, + "name": "ɵResourceLoaderImpl_BaseFactory" + } + } + ], + "directives": [] + } +} \ No newline at end of file