From e5d29f6e402ef6d2b173d555c471d2417401ab6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 21 Jan 2022 18:27:34 -0500 Subject: [PATCH] fix: incorrect conciseBody lookahead (#14194) --- .../babel-parser/src/parser/expression.js | 6 ++- .../input.js | 1 + .../output.json | 40 +++++++++++++++++++ .../invalid-arrow-before-in/input.js | 1 + .../invalid-arrow-before-in/options.json | 3 ++ 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/concise-body-binary-in-regression-14193/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/concise-body-binary-in-regression-14193/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-arrow-before-in/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-arrow-before-in/options.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index a5671162f971..cab67f8f80cf 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -2373,8 +2373,10 @@ export default class ExpressionParser extends LValParser { ): N.ArrowFunctionExpression { this.scope.enter(SCOPE_FUNCTION | SCOPE_ARROW); let flags = functionFlags(isAsync, false); - // ConciseBody and AsyncConciseBody inherit [In] - if (!this.match(tt.bracketL) && this.prodParam.hasIn) { + // ConciseBody[In] : + // [lookahead ≠ {] ExpressionBody[?In, ~Await] + // { FunctionBody[~Yield, ~Await] } + if (!this.match(tt.braceL) && this.prodParam.hasIn) { flags |= PARAM_IN; } this.prodParam.enter(flags); diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/concise-body-binary-in-regression-14193/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/concise-body-binary-in-regression-14193/input.js new file mode 100644 index 000000000000..bb4eca7991df --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/concise-body-binary-in-regression-14193/input.js @@ -0,0 +1 @@ +() => [] in x diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/concise-body-binary-in-regression-14193/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/concise-body-binary-in-regression-14193/output.json new file mode 100644 index 000000000000..ee5545b32b1f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/concise-body-binary-in-regression-14193/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":13,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}, + "program": { + "type": "Program", + "start":0,"end":13,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":13,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":13,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}, + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BinaryExpression", + "start":6,"end":13,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":13}}, + "left": { + "type": "ArrayExpression", + "start":6,"end":8,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":8}}, + "elements": [] + }, + "operator": "in", + "right": { + "type": "Identifier", + "start":12,"end":13,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":13},"identifierName":"x"}, + "name": "x" + } + } + } + } + ], + "directives": [] + } +} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-arrow-before-in/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-arrow-before-in/input.js new file mode 100644 index 000000000000..5515e71c9ccf --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-arrow-before-in/input.js @@ -0,0 +1 @@ +() => {} in x diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-arrow-before-in/options.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-arrow-before-in/options.json new file mode 100644 index 000000000000..93db7641c75b --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-arrow-before-in/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:9)" +} \ No newline at end of file