From d2c75c2d380ba8ab6bb15eeb926e48330d05b2ef Mon Sep 17 00:00:00 2001 From: Retsam Date: Tue, 9 Oct 2018 17:25:31 -0400 Subject: [PATCH] fix: corrects handling of newline after async with paren-less arrow function (#8830) If async is followed by a newline, then a paren-less arrow function should be parsed as two expressions --- .../babel-parser/src/parser/expression.js | 7 +- .../async-functions/newline-arrow/input.js | 2 + .../async-functions/newline-arrow/output.json | 136 ++++++++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/newline-arrow/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/newline-arrow/output.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index e1ea1aa55d..dae74bf3d6 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -794,7 +794,12 @@ export default class ExpressionParser extends LValParser { ) { this.next(); return this.parseFunction(node, false, false, true); - } else if (canBeArrow && id.name === "async" && this.match(tt.name)) { + } else if ( + canBeArrow && + !this.canInsertSemicolon() && + id.name === "async" && + this.match(tt.name) + ) { const oldYield = this.state.yieldInPossibleArrowParameters; this.state.yieldInPossibleArrowParameters = null; const params = [this.parseIdentifier()]; diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/newline-arrow/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/newline-arrow/input.js new file mode 100644 index 0000000000..200a144766 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/newline-arrow/input.js @@ -0,0 +1,2 @@ +async +x => x diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/newline-arrow/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/newline-arrow/output.json new file mode 100644 index 0000000000..4c44c11863 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/newline-arrow/output.json @@ -0,0 +1,136 @@ +{ + "type": "File", + "start": 0, + "end": 12, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 12, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 5, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 5 + } + }, + "expression": { + "type": "Identifier", + "start": 0, + "end": 5, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 5 + }, + "identifierName": "async" + }, + "name": "async" + } + }, + { + "type": "ExpressionStatement", + "start": 6, + "end": 12, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "expression": { + "type": "ArrowFunctionExpression", + "start": 6, + "end": 12, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 1 + }, + "identifierName": "x" + }, + "name": "x" + } + ], + "body": { + "type": "Identifier", + "start": 11, + "end": 12, + "loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 6 + }, + "identifierName": "x" + }, + "name": "x" + } + } + } + ], + "directives": [] + } +} \ No newline at end of file