From b14317c361ae58f4bbf739e9f2878403dd410b20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 6 Nov 2020 20:11:12 -0500 Subject: [PATCH 1/9] fix: disallow all parenthesized pattern except parsing LHS --- .../babel-parser/src/parser/expression.js | 16 +-- packages/babel-parser/src/parser/lval.js | 53 ++++++--- packages/babel-parser/src/plugins/estree.js | 12 ++- packages/babel-parser/src/plugins/flow.js | 9 +- .../invalid-parenthesized-in-params/input.js | 1 + .../output.json | 50 +++++++++ .../parenthesized-lhs-in-arrow-param/input.js | 1 + .../output.json | 101 ++++++++++++++++++ .../es2017/async-functions/3/options.json | 3 - .../input.js | 0 .../output.json | 56 ++++++++++ .../input.js | 1 + .../output.json | 62 +++++++++++ 13 files changed, 323 insertions(+), 42 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/parenthesized-lhs-in-arrow-param/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/parenthesized-lhs-in-arrow-param/output.json delete mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/3/options.json rename packages/babel-parser/test/fixtures/es2017/async-functions/{3 => parenthesized-async-arrow-binding-identifier}/input.js (100%) create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/output.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 57ba5d25a35e..59221e8ca91e 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -278,7 +278,7 @@ export default class ExpressionParser extends LValParser { node.operator = operator; if (this.match(tt.eq)) { - node.left = this.toAssignable(left); + node.left = this.toAssignable(left, /* isLHS */ true); refExpressionErrors.doubleProto = -1; // reset because double __proto__ is valid in assignment expression } else { node.left = left; @@ -842,7 +842,6 @@ export default class ExpressionParser extends LValParser { nodeForExtra?: ?N.Node, ): $ReadOnlyArray { const elts = []; - let innerParenStart; let first = true; const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody; this.state.inFSharpPipelineDirectBody = false; @@ -875,12 +874,6 @@ export default class ExpressionParser extends LValParser { } } - // we need to make sure that if this is an async arrow functions, - // that we don't allow inner parens inside the params - if (this.match(tt.parenL) && !innerParenStart) { - innerParenStart = this.state.start; - } - elts.push( this.parseExprListItem( false, @@ -891,11 +884,6 @@ export default class ExpressionParser extends LValParser { ); } - // we found an async arrow function so let's not allow any inner parens - if (possibleAsyncArrow && innerParenStart && this.shouldParseAsyncArrow()) { - this.unexpected(); - } - this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody; return elts; @@ -2056,7 +2044,7 @@ export default class ExpressionParser extends LValParser { params: N.Expression[], trailingCommaPos: ?number, ): void { - node.params = this.toAssignableList(params, trailingCommaPos); + node.params = this.toAssignableList(params, trailingCommaPos, false); } parseFunctionBodyAndFinish( diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 42c094b76203..7aaac489018d 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -51,18 +51,32 @@ export default class LValParser extends NodeUtils { +parseDecorator: () => Decorator; */ - // Convert existing expression atom to assignable pattern - // if possible. - // NOTE: There is a corresponding "isAssignable" method in flow.js. - // When this one is updated, please check if also that one needs to be updated. + /** + * Convert existing expression atom to assignable pattern + * if possible. Also checks invalid destructuring targets: - toAssignable(node: Node): Node { + - Parenthesized Destructuring patterns + - RestElement is not the last element + - Missing `=` in assignment pattern + + NOTE: There is a corresponding "isAssignable" method in flow.js. + When this one is updated, please check if also that one needs to be updated. + + * @param {Node} node The expression atom + * @param {boolean} [isLHS=false] Whether we are parsing a LeftHandSideExpression. If isLHS is `true`, the following cases are allowed: + `[(a)] = [0]`, `[(a.b)] = [0]` + + * @returns {Node} The converted assignable pattern + * @memberof LValParser + */ + toAssignable(node: Node, isLHS: boolean = false): Node { let parenthesized = undefined; if (node.type === "ParenthesizedExpression" || node.extra?.parenthesized) { parenthesized = unwrapParenthesizedExpression(node); if ( - parenthesized.type !== "Identifier" && - parenthesized.type !== "MemberExpression" + !isLHS || + (parenthesized.type !== "Identifier" && + parenthesized.type !== "MemberExpression") ) { this.raise(node.start, Errors.InvalidParenthesizedAssignment); } @@ -84,7 +98,7 @@ export default class LValParser extends NodeUtils { ) { const prop = node.properties[i]; const isLast = i === last; - this.toAssignableObjectExpressionProp(prop, isLast); + this.toAssignableObjectExpressionProp(prop, isLast, isLHS); if ( isLast && @@ -97,7 +111,7 @@ export default class LValParser extends NodeUtils { break; case "ObjectProperty": - this.toAssignable(node.value); + this.toAssignable(node.value, isLHS); break; case "SpreadElement": { @@ -105,13 +119,13 @@ export default class LValParser extends NodeUtils { node.type = "RestElement"; const arg = node.argument; - this.toAssignable(arg); + this.toAssignable(arg, isLHS); break; } case "ArrayExpression": node.type = "ArrayPattern"; - this.toAssignableList(node.elements, node.extra?.trailingComma); + this.toAssignableList(node.elements, node.extra?.trailingComma, isLHS); break; case "AssignmentExpression": @@ -121,11 +135,11 @@ export default class LValParser extends NodeUtils { node.type = "AssignmentPattern"; delete node.operator; - this.toAssignable(node.left); + this.toAssignable(node.left, isLHS); break; case "ParenthesizedExpression": - this.toAssignable(((parenthesized: any): Expression)); + this.toAssignable(((parenthesized: any): Expression), isLHS); break; default: @@ -135,7 +149,11 @@ export default class LValParser extends NodeUtils { return node; } - toAssignableObjectExpressionProp(prop: Node, isLast: boolean) { + toAssignableObjectExpressionProp( + prop: Node, + isLast: boolean, + isLHS: boolean, + ) { if (prop.type === "ObjectMethod") { const error = prop.kind === "get" || prop.kind === "set" @@ -148,7 +166,7 @@ export default class LValParser extends NodeUtils { } else if (prop.type === "SpreadElement" && !isLast) { this.raiseRestNotLast(prop.start); } else { - this.toAssignable(prop); + this.toAssignable(prop, isLHS); } } @@ -157,6 +175,7 @@ export default class LValParser extends NodeUtils { toAssignableList( exprList: Expression[], trailingCommaPos?: ?number, + isLHS: boolean, ): $ReadOnlyArray { let end = exprList.length; if (end) { @@ -166,7 +185,7 @@ export default class LValParser extends NodeUtils { } else if (last?.type === "SpreadElement") { last.type = "RestElement"; const arg = last.argument; - this.toAssignable(arg); + this.toAssignable(arg, isLHS); if ( arg.type !== "Identifier" && arg.type !== "MemberExpression" && @@ -186,7 +205,7 @@ export default class LValParser extends NodeUtils { for (let i = 0; i < end; i++) { const elt = exprList[i]; if (elt) { - this.toAssignable(elt); + this.toAssignable(elt, isLHS); if (elt.type === "RestElement") { this.raiseRestNotLast(elt.start); } diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 27df1ad74148..7c313e77f12d 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -341,23 +341,27 @@ export default (superClass: Class): Class => return (node: any); } - toAssignable(node: N.Node): N.Node { + toAssignable(node: N.Node, isLHS: boolean = false): N.Node { if (isSimpleProperty(node)) { this.toAssignable(node.value); return node; } - return super.toAssignable(node); + return super.toAssignable(node, isLHS); } - toAssignableObjectExpressionProp(prop: N.Node, isLast: boolean) { + toAssignableObjectExpressionProp( + prop: N.Node, + isLast: boolean, + isLHS: boolean, + ) { if (prop.kind === "get" || prop.kind === "set") { throw this.raise(prop.key.start, Errors.PatternHasAccessor); } else if (prop.method) { throw this.raise(prop.key.start, Errors.PatternHasMethod); } else { - super.toAssignableObjectExpressionProp(prop, isLast); + super.toAssignableObjectExpressionProp(prop, isLast, isLHS); } } diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index 53dc48f3067e..e14638301a63 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -2192,11 +2192,11 @@ export default (superClass: Class): Class => } } - toAssignable(node: N.Node): N.Node { + toAssignable(node: N.Node, isLHS: boolean = false): N.Node { if (node.type === "TypeCastExpression") { - return super.toAssignable(this.typeCastToParameter(node)); + return super.toAssignable(this.typeCastToParameter(node), isLHS); } else { - return super.toAssignable(node); + return super.toAssignable(node, isLHS); } } @@ -2204,6 +2204,7 @@ export default (superClass: Class): Class => toAssignableList( exprList: N.Expression[], trailingCommaPos?: ?number, + isLHS: boolean = true, ): $ReadOnlyArray { for (let i = 0; i < exprList.length; i++) { const expr = exprList[i]; @@ -2211,7 +2212,7 @@ export default (superClass: Class): Class => exprList[i] = this.typeCastToParameter(expr); } } - return super.toAssignableList(exprList, trailingCommaPos); + return super.toAssignableList(exprList, trailingCommaPos, isLHS); } // this is a list of nodes, from something like a call expression, we need to filter the diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/input.js new file mode 100644 index 000000000000..63159238e7b9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/input.js @@ -0,0 +1 @@ +([(a)]) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/output.json new file mode 100644 index 000000000000..c2220d23a6d6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/output.json @@ -0,0 +1,50 @@ +{ + "type": "File", + "start":0,"end":13,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:3)" + ], + "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": [ + { + "type": "ArrayPattern", + "start":1,"end":6,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":6}}, + "elements": [ + { + "type": "Identifier", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 2 + }, + "name": "a" + } + ] + } + ], + "body": { + "type": "BlockStatement", + "start":11,"end":13,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":13}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/parenthesized-lhs-in-arrow-param/input.js b/packages/babel-parser/test/fixtures/es2015/destructuring/parenthesized-lhs-in-arrow-param/input.js new file mode 100644 index 000000000000..dcf47493a4fd --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/parenthesized-lhs-in-arrow-param/input.js @@ -0,0 +1 @@ +(a = function (a) { [(a)] = [0] }) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/parenthesized-lhs-in-arrow-param/output.json b/packages/babel-parser/test/fixtures/es2015/destructuring/parenthesized-lhs-in-arrow-param/output.json new file mode 100644 index 000000000000..ecb394e8b96e --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/parenthesized-lhs-in-arrow-param/output.json @@ -0,0 +1,101 @@ +{ + "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": "ExpressionStatement", + "start":0,"end":40,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":40,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "AssignmentPattern", + "start":1,"end":33,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":33}}, + "left": { + "type": "Identifier", + "start":1,"end":2,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":2},"identifierName":"a"}, + "name": "a" + }, + "right": { + "type": "FunctionExpression", + "start":5,"end":33,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":33}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start":15,"end":16,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":16},"identifierName":"a"}, + "name": "a" + } + ], + "body": { + "type": "BlockStatement", + "start":18,"end":33,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":33}}, + "body": [ + { + "type": "ExpressionStatement", + "start":20,"end":31,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":31}}, + "expression": { + "type": "AssignmentExpression", + "start":20,"end":31,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":31}}, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":20,"end":25,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":25}}, + "elements": [ + { + "type": "Identifier", + "start":22,"end":23,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":23},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 21 + }, + "name": "a" + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":28,"end":31,"loc":{"start":{"line":1,"column":28},"end":{"line":1,"column":31}}, + "elements": [ + { + "type": "NumericLiteral", + "start":29,"end":30,"loc":{"start":{"line":1,"column":29},"end":{"line":1,"column":30}}, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + ] + } + } + } + ], + "directives": [] + } + } + } + ], + "body": { + "type": "BlockStatement", + "start":38,"end":40,"loc":{"start":{"line":1,"column":38},"end":{"line":1,"column":40}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/3/options.json b/packages/babel-parser/test/fixtures/es2017/async-functions/3/options.json deleted file mode 100644 index fa579aa83145..000000000000 --- a/packages/babel-parser/test/fixtures/es2017/async-functions/3/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token (1:24)" -} diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/3/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/3/input.js rename to packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/input.js diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/output.json new file mode 100644 index 000000000000..984ab4dbde4c --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/output.json @@ -0,0 +1,56 @@ +{ + "type": "File", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:18)" + ], + "program": { + "type": "Program", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":29,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":29}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "ArrowFunctionExpression", + "start":10,"end":29,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":29}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "Identifier", + "start":18,"end":21,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":21},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 17 + }, + "name": "foo" + } + ], + "body": { + "type": "BlockStatement", + "start":27,"end":29,"loc":{"start":{"line":1,"column":27},"end":{"line":1,"column":29}}, + "body": [], + "directives": [] + } + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/input.js new file mode 100644 index 000000000000..3cd89cca4326 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/input.js @@ -0,0 +1 @@ +var foo = async ([(foo)]) => {}; diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/output.json new file mode 100644 index 000000000000..2113ddb5a8da --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/output.json @@ -0,0 +1,62 @@ +{ + "type": "File", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":32}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:19)" + ], + "program": { + "type": "Program", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":32}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":32}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":31,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":31}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "ArrowFunctionExpression", + "start":10,"end":31,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":31}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "ArrayPattern", + "start":17,"end":24,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":24}}, + "elements": [ + { + "type": "Identifier", + "start":19,"end":22,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":22},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 18 + }, + "name": "foo" + } + ] + } + ], + "body": { + "type": "BlockStatement", + "start":29,"end":31,"loc":{"start":{"line":1,"column":29},"end":{"line":1,"column":31}}, + "body": [], + "directives": [] + } + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file From fb8883f966738cb650d3ac2491589d6342664633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 6 Nov 2020 20:43:27 -0500 Subject: [PATCH 2/9] fix: forStatement requires LHS --- packages/babel-parser/src/parser/statement.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index cf14262965f8..a4d71ddc31ae 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -528,7 +528,7 @@ export default class StatementParser extends ExpressionParser { const refExpressionErrors = new ExpressionErrors(); const init = this.parseExpression(true, refExpressionErrors); if (this.match(tt._in) || this.isContextual("of")) { - this.toAssignable(init); + this.toAssignable(init, /* isLHS */ true); const description = this.isContextual("of") ? "for-of statement" : "for-in statement"; From ff6740b41ec6d419342e2107f59ed42ac9bb4676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Sat, 7 Nov 2020 10:51:42 -0500 Subject: [PATCH 3/9] simplify toAssignable --- .../babel-parser/src/parser/expression.js | 6 ------ packages/babel-parser/src/parser/lval.js | 20 +++++++++---------- packages/babel-parser/src/plugins/estree.js | 8 ++------ .../src/plugins/typescript/index.js | 10 +++++----- 4 files changed, 17 insertions(+), 27 deletions(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 59221e8ca91e..56ef4188f7e4 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1409,12 +1409,6 @@ export default class ExpressionParser extends LValParser { ) { this.expressionScope.validateAsPattern(); this.expressionScope.exit(); - for (const param of exprList) { - if (param.extra && param.extra.parenthesized) { - this.unexpected(param.extra.parenStart); - } - } - this.parseArrowExpression(arrowNode, exprList, false); return arrowNode; } diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 7aaac489018d..40067c19b1f2 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -98,7 +98,7 @@ export default class LValParser extends NodeUtils { ) { const prop = node.properties[i]; const isLast = i === last; - this.toAssignableObjectExpressionProp(prop, isLast, isLHS); + this.toAssignableObjectExpressionProp(prop, isLast); if ( isLast && @@ -111,7 +111,8 @@ export default class LValParser extends NodeUtils { break; case "ObjectProperty": - this.toAssignable(node.value, isLHS); + // ObjectProperty is not allowed in LHS + this.toAssignable(node.value, /* isLHS */ false); break; case "SpreadElement": { @@ -135,7 +136,8 @@ export default class LValParser extends NodeUtils { node.type = "AssignmentPattern"; delete node.operator; - this.toAssignable(node.left, isLHS); + // AssignmentPattern is not allowed in LHS + this.toAssignable(node.left, /* isLHS */ false); break; case "ParenthesizedExpression": @@ -149,11 +151,7 @@ export default class LValParser extends NodeUtils { return node; } - toAssignableObjectExpressionProp( - prop: Node, - isLast: boolean, - isLHS: boolean, - ) { + toAssignableObjectExpressionProp(prop: Node, isLast: boolean) { if (prop.type === "ObjectMethod") { const error = prop.kind === "get" || prop.kind === "set" @@ -166,7 +164,8 @@ export default class LValParser extends NodeUtils { } else if (prop.type === "SpreadElement" && !isLast) { this.raiseRestNotLast(prop.start); } else { - this.toAssignable(prop, isLHS); + // ObjectPattern is not allowed in LHS + this.toAssignable(prop); } } @@ -184,8 +183,9 @@ export default class LValParser extends NodeUtils { --end; } else if (last?.type === "SpreadElement") { last.type = "RestElement"; - const arg = last.argument; + let arg = last.argument; this.toAssignable(arg, isLHS); + arg = unwrapParenthesizedExpression(arg); if ( arg.type !== "Identifier" && arg.type !== "MemberExpression" && diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 7c313e77f12d..8111cd2891e3 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -351,17 +351,13 @@ export default (superClass: Class): Class => return super.toAssignable(node, isLHS); } - toAssignableObjectExpressionProp( - prop: N.Node, - isLast: boolean, - isLHS: boolean, - ) { + toAssignableObjectExpressionProp(prop: N.Node, isLast: boolean) { if (prop.kind === "get" || prop.kind === "set") { throw this.raise(prop.key.start, Errors.PatternHasAccessor); } else if (prop.method) { throw this.raise(prop.key.start, Errors.PatternHasMethod); } else { - super.toAssignableObjectExpressionProp(prop, isLast, isLHS); + super.toAssignableObjectExpressionProp(prop, isLast); } } diff --git a/packages/babel-parser/src/plugins/typescript/index.js b/packages/babel-parser/src/plugins/typescript/index.js index e054410f81bc..3717fa09af8a 100644 --- a/packages/babel-parser/src/plugins/typescript/index.js +++ b/packages/babel-parser/src/plugins/typescript/index.js @@ -2596,19 +2596,19 @@ export default (superClass: Class): Class => return param; } - toAssignable(node: N.Node): N.Node { + toAssignable(node: N.Node, isLHS: boolean = false): N.Node { switch (node.type) { case "TSTypeCastExpression": - return super.toAssignable(this.typeCastToParameter(node)); + return super.toAssignable(this.typeCastToParameter(node), isLHS); case "TSParameterProperty": - return super.toAssignable(node); + return super.toAssignable(node, isLHS); case "TSAsExpression": case "TSNonNullExpression": case "TSTypeAssertion": - node.expression = this.toAssignable(node.expression); + node.expression = this.toAssignable(node.expression, isLHS); return node; default: - return super.toAssignable(node); + return super.toAssignable(node, isLHS); } } From 8e809d964e1e02c13f3b93f127bf3aa20b61bc96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Sat, 7 Nov 2020 11:19:46 -0500 Subject: [PATCH 4/9] add more test cases --- packages/babel-parser/src/parser/lval.js | 10 +-- .../options.json | 3 - .../options.json | 3 - .../options.json | 3 - .../options.json | 3 - .../options.json | 3 - .../options.json | 3 - .../invalid-pattern-in-rest-binding/input.js | 1 + .../output.json | 54 +++++++++++++++ .../options.json | 0 .../options.json | 3 - .../options.json | 3 - .../options.json | 3 - .../options.json | 3 - .../options.json | 3 - .../valid-pattern-in-rest-lhs/input.js | 1 + .../valid-pattern-in-rest-lhs/output.json | 46 +++++++++++++ .../valid-pattern-in-rest-member-lhs/input.js | 1 + .../output.json | 56 ++++++++++++++++ .../inner-parens-2}/input.js | 0 .../inner-parens-2/output.json | 52 +++++++++++++++ .../input.js | 0 .../output.json | 0 .../arrow-functions/inner-parens/options.json | 3 - .../arrow-functions/inner-parens/output.json | 56 ++++++++++++++++ .../lhs-parenthesized-rest-member/input.js | 1 + .../lhs-parenthesized-rest-member/output.json | 56 ++++++++++++++++ .../es2015/uncategorised/240/input.js | 1 - .../es2015/uncategorised/240/options.json | 3 - .../es2015/uncategorised/241/options.json | 3 - .../input.js | 1 + .../output.json | 66 +++++++++++++++++++ .../input.js | 1 + .../output.json | 66 +++++++++++++++++++ .../options.json | 3 - .../output.json | 47 +++++++++++++ .../options.json | 3 - .../output.json | 56 ++++++++++++++++ .../invalid-syntax/migrated_0085/input.js | 1 - .../invalid-syntax/migrated_0085/options.json | 3 - .../invalid-syntax/migrated_0086/input.js | 1 - .../invalid-syntax/migrated_0086/options.json | 3 - 42 files changed, 567 insertions(+), 61 deletions(-) delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-3/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-4/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-5/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-6/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-left-hand-side/options.json create mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-pattern-in-rest-binding/input.js create mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-pattern-in-rest-binding/output.json rename packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/{invalid-parenthesized-assignment-pattern-2 => }/options.json (100%) delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-1/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-2/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-3/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-member-expression/options.json delete mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-expression/options.json create mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-lhs/input.js create mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-lhs/output.json create mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-member-lhs/input.js create mode 100644 packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-member-lhs/output.json rename packages/babel-parser/test/fixtures/es2015/{uncategorised/241 => arrow-functions/inner-parens-2}/input.js (100%) create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-2/output.json rename packages/babel-parser/test/fixtures/es2015/arrow-functions/{invalid-parenthesized-in-params => inner-parens-array-pattern}/input.js (100%) rename packages/babel-parser/test/fixtures/es2015/arrow-functions/{invalid-parenthesized-in-params => inner-parens-array-pattern}/output.json (100%) delete mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens/options.json create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-rest-member/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-rest-member/output.json delete mode 100644 packages/babel-parser/test/fixtures/es2015/uncategorised/240/input.js delete mode 100644 packages/babel-parser/test/fixtures/es2015/uncategorised/240/options.json delete mode 100644 packages/babel-parser/test/fixtures/es2015/uncategorised/241/options.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/output.json delete mode 100644 packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-arrow/options.json create mode 100644 packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-arrow/output.json delete mode 100644 packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-rest/options.json create mode 100644 packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-rest/output.json delete mode 100644 packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0085/input.js delete mode 100644 packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0085/options.json delete mode 100644 packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0086/input.js delete mode 100644 packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0086/options.json diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 40067c19b1f2..13b4b6b42555 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -1,5 +1,6 @@ // @flow +/*:: declare var invariant; */ import * as charCodes from "charcodes"; import { types as tt, type TokenType } from "../tokenizer/types"; import type { @@ -24,7 +25,7 @@ import { type BindingTypes, BIND_NONE } from "../util/scopeflags"; import { ExpressionErrors } from "./util"; import { Errors } from "./error"; -const unwrapParenthesizedExpression = (node: Node) => { +const unwrapParenthesizedExpression = (node: Node): Node => { return node.type === "ParenthesizedExpression" ? unwrapParenthesizedExpression(node.expression) : node; @@ -112,7 +113,7 @@ export default class LValParser extends NodeUtils { case "ObjectProperty": // ObjectProperty is not allowed in LHS - this.toAssignable(node.value, /* isLHS */ false); + this.toAssignable(node.value); break; case "SpreadElement": { @@ -137,11 +138,12 @@ export default class LValParser extends NodeUtils { node.type = "AssignmentPattern"; delete node.operator; // AssignmentPattern is not allowed in LHS - this.toAssignable(node.left, /* isLHS */ false); + this.toAssignable(node.left); break; case "ParenthesizedExpression": - this.toAssignable(((parenthesized: any): Expression), isLHS); + /*::invariant (parenthesized !== undefined) */ + this.toAssignable(parenthesized, isLHS); break; default: diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-3/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-3/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-3/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-4/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-4/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-4/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-5/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-5/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-5/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-6/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-6/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-6/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-left-hand-side/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-left-hand-side/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-left-hand-side/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-pattern-in-rest-binding/input.js b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-pattern-in-rest-binding/input.js new file mode 100644 index 000000000000..eee831f1acfb --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-pattern-in-rest-binding/input.js @@ -0,0 +1 @@ +([...(a)]) => {} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-pattern-in-rest-binding/output.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-pattern-in-rest-binding/output.json new file mode 100644 index 000000000000..0bf2bd22b495 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-pattern-in-rest-binding/output.json @@ -0,0 +1,54 @@ +{ + "type": "File", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:5)" + ], + "program": { + "type": "Program", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "ArrayPattern", + "start":1,"end":9,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":9}}, + "elements": [ + { + "type": "RestElement", + "start":2,"end":8,"loc":{"start":{"line":1,"column":2},"end":{"line":1,"column":8}}, + "argument": { + "type": "ParenthesizedExpression", + "start":5,"end":8,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":8}}, + "expression": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"a"}, + "name": "a" + } + } + } + ] + } + ], + "body": { + "type": "BlockStatement", + "start":14,"end":16,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":16}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-2/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/options.json similarity index 100% rename from packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/invalid-parenthesized-assignment-pattern-2/options.json rename to packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/options.json diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-1/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-1/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-1/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-2/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-2/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-2/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-3/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-3/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-3/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-member-expression/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-member-expression/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-assignment-array-pattern-member-expression/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-expression/options.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-expression/options.json deleted file mode 100644 index 0861962d889d..000000000000 --- a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-parenthesized-expression/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createParenthesizedExpressions": true -} diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-lhs/input.js b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-lhs/input.js new file mode 100644 index 000000000000..995e36cbbf15 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-lhs/input.js @@ -0,0 +1 @@ +[...(a)] = [] diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-lhs/output.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-lhs/output.json new file mode 100644 index 000000000000..e921772279a5 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-lhs/output.json @@ -0,0 +1,46 @@ +{ + "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": "AssignmentExpression", + "start":0,"end":13,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":0,"end":8,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}}, + "elements": [ + { + "type": "RestElement", + "start":1,"end":7,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":7}}, + "argument": { + "type": "ParenthesizedExpression", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7}}, + "expression": { + "type": "Identifier", + "start":5,"end":6,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":6},"identifierName":"a"}, + "name": "a" + } + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":11,"end":13,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":13}}, + "elements": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-member-lhs/input.js b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-member-lhs/input.js new file mode 100644 index 000000000000..1272c4ab8d93 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-member-lhs/input.js @@ -0,0 +1 @@ +[...(a.b)] = [] diff --git a/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-member-lhs/output.json b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-member-lhs/output.json new file mode 100644 index 000000000000..fcc263340f86 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/create-parenthesized-expressions/valid-pattern-in-rest-member-lhs/output.json @@ -0,0 +1,56 @@ +{ + "type": "File", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "program": { + "type": "Program", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "expression": { + "type": "AssignmentExpression", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "elements": [ + { + "type": "RestElement", + "start":1,"end":9,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":9}}, + "argument": { + "type": "ParenthesizedExpression", + "start":4,"end":9,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":9}}, + "expression": { + "type": "MemberExpression", + "start":5,"end":8,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":8}}, + "object": { + "type": "Identifier", + "start":5,"end":6,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":6},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"b"}, + "name": "b" + } + } + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":13,"end":15,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":15}}, + "elements": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/uncategorised/241/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-2/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/es2015/uncategorised/241/input.js rename to packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-2/input.js diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-2/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-2/output.json new file mode 100644 index 000000000000..09d15bfd29ff --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-2/output.json @@ -0,0 +1,52 @@ +{ + "type": "File", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:5)" + ], + "program": { + "type": "Program", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start":1,"end":2,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":2},"identifierName":"a"}, + "name": "a" + }, + { + "type": "Identifier", + "start":5,"end":6,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":6},"identifierName":"b"}, + "extra": { + "parenthesized": true, + "parenStart": 4 + }, + "name": "b" + } + ], + "body": { + "type": "NumericLiteral", + "start":12,"end":14,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":14}}, + "extra": { + "rawValue": 42, + "raw": "42" + }, + "value": 42 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/input.js rename to packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern/input.js diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern/output.json similarity index 100% rename from packages/babel-parser/test/fixtures/es2015/arrow-functions/invalid-parenthesized-in-params/output.json rename to packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern/output.json diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens/options.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens/options.json deleted file mode 100644 index cb6c66081ebf..000000000000 --- a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token (1:11)" -} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens/output.json new file mode 100644 index 000000000000..07989bd92794 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens/output.json @@ -0,0 +1,56 @@ +{ + "type": "File", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:12)" + ], + "program": { + "type": "Program", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":23,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":23}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "ArrowFunctionExpression", + "start":10,"end":23,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":23}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start":12,"end":15,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":15},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 11 + }, + "name": "foo" + } + ], + "body": { + "type": "BlockStatement", + "start":21,"end":23,"loc":{"start":{"line":1,"column":21},"end":{"line":1,"column":23}}, + "body": [], + "directives": [] + } + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-rest-member/input.js b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-rest-member/input.js new file mode 100644 index 000000000000..552f8ecd7b95 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-rest-member/input.js @@ -0,0 +1 @@ +[...(a.b)] = []; diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-rest-member/output.json b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-rest-member/output.json new file mode 100644 index 000000000000..cbb65676f607 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-rest-member/output.json @@ -0,0 +1,56 @@ +{ + "type": "File", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "program": { + "type": "Program", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "expression": { + "type": "AssignmentExpression", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "elements": [ + { + "type": "RestElement", + "start":1,"end":9,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":9}}, + "argument": { + "type": "MemberExpression", + "start":5,"end":8,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":8}}, + "extra": { + "parenthesized": true, + "parenStart": 4 + }, + "object": { + "type": "Identifier", + "start":5,"end":6,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":6},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"b"}, + "name": "b" + } + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":13,"end":15,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":15}}, + "elements": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/uncategorised/240/input.js b/packages/babel-parser/test/fixtures/es2015/uncategorised/240/input.js deleted file mode 100644 index cc7b1e3792e2..000000000000 --- a/packages/babel-parser/test/fixtures/es2015/uncategorised/240/input.js +++ /dev/null @@ -1 +0,0 @@ -((a)) => 42 \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/uncategorised/240/options.json b/packages/babel-parser/test/fixtures/es2015/uncategorised/240/options.json deleted file mode 100644 index b5b75f41875c..000000000000 --- a/packages/babel-parser/test/fixtures/es2015/uncategorised/240/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token (1:1)" -} diff --git a/packages/babel-parser/test/fixtures/es2015/uncategorised/241/options.json b/packages/babel-parser/test/fixtures/es2015/uncategorised/241/options.json deleted file mode 100644 index 27a7b64d71d4..000000000000 --- a/packages/babel-parser/test/fixtures/es2015/uncategorised/241/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token (1:4)" -} diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/input.js new file mode 100644 index 000000000000..94e158632d1a --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/input.js @@ -0,0 +1 @@ +var foo = async ([...(foo)]) => {}; diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/output.json new file mode 100644 index 000000000000..0d501cde269f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/output.json @@ -0,0 +1,66 @@ +{ + "type": "File", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:22)" + ], + "program": { + "type": "Program", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":34,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":34}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "ArrowFunctionExpression", + "start":10,"end":34,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":34}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "ArrayPattern", + "start":17,"end":27,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":27}}, + "elements": [ + { + "type": "RestElement", + "start":18,"end":26,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":26}}, + "argument": { + "type": "Identifier", + "start":22,"end":25,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":25},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 21 + }, + "name": "foo" + } + } + ] + } + ], + "body": { + "type": "BlockStatement", + "start":32,"end":34,"loc":{"start":{"line":1,"column":32},"end":{"line":1,"column":34}}, + "body": [], + "directives": [] + } + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/input.js b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/input.js new file mode 100644 index 000000000000..7d476ae8fce4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/input.js @@ -0,0 +1 @@ +var foo = async ({...(foo)}) => {}; diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/output.json new file mode 100644 index 000000000000..66f60ce4f6af --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/output.json @@ -0,0 +1,66 @@ +{ + "type": "File", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:22)" + ], + "program": { + "type": "Program", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":34,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":34}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "ArrowFunctionExpression", + "start":10,"end":34,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":34}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "ObjectPattern", + "start":17,"end":27,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":27}}, + "properties": [ + { + "type": "RestElement", + "start":18,"end":26,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":26}}, + "argument": { + "type": "Identifier", + "start":22,"end":25,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":25},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 21 + }, + "name": "foo" + } + } + ] + } + ], + "body": { + "type": "BlockStatement", + "start":32,"end":34,"loc":{"start":{"line":1,"column":32},"end":{"line":1,"column":34}}, + "body": [], + "directives": [] + } + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-arrow/options.json b/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-arrow/options.json deleted file mode 100644 index b5b75f41875c..000000000000 --- a/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-arrow/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token (1:1)" -} diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-arrow/output.json b/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-arrow/output.json new file mode 100644 index 000000000000..9fb39c9ca6ef --- /dev/null +++ b/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-arrow/output.json @@ -0,0 +1,47 @@ +{ + "type": "File", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:2)" + ], + "program": { + "type": "Program", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start":2,"end":3,"loc":{"start":{"line":1,"column":2},"end":{"line":1,"column":3},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 1 + }, + "name": "a" + } + ], + "body": { + "type": "NumericLiteral", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10}}, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-rest/options.json b/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-rest/options.json deleted file mode 100644 index b5b75f41875c..000000000000 --- a/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-rest/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token (1:1)" -} diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-rest/output.json b/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-rest/output.json new file mode 100644 index 000000000000..7aefdb8c93dc --- /dev/null +++ b/packages/babel-parser/test/fixtures/esprima/es2015-arrow-function/non-arrow-param-followed-by-rest/output.json @@ -0,0 +1,56 @@ +{ + "type": "File", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:2)" + ], + "program": { + "type": "Program", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start":2,"end":3,"loc":{"start":{"line":1,"column":2},"end":{"line":1,"column":3},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 1 + }, + "name": "a" + }, + { + "type": "RestElement", + "start":5,"end":9,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":9}}, + "argument": { + "type": "Identifier", + "start":8,"end":9,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":9},"identifierName":"b"}, + "name": "b" + } + } + ], + "body": { + "type": "NumericLiteral", + "start":14,"end":15,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":15}}, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0085/input.js b/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0085/input.js deleted file mode 100644 index 375e21014c8b..000000000000 --- a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0085/input.js +++ /dev/null @@ -1 +0,0 @@ -((a)) => 42 diff --git a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0085/options.json b/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0085/options.json deleted file mode 100644 index b5b75f41875c..000000000000 --- a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0085/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token (1:1)" -} diff --git a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0086/input.js b/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0086/input.js deleted file mode 100644 index 89739afb96ad..000000000000 --- a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0086/input.js +++ /dev/null @@ -1 +0,0 @@ -(a, (b)) => 42 diff --git a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0086/options.json b/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0086/options.json deleted file mode 100644 index 27a7b64d71d4..000000000000 --- a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0086/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Unexpected token (1:4)" -} From 8a8e3f5f111d5b80f1d59935eb13d6d7e4e9ce46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Sat, 7 Nov 2020 12:27:29 -0500 Subject: [PATCH 5/9] fix: pass through isLHS on object property and assignment expression --- packages/babel-parser/src/parser/lval.js | 17 ++-- packages/babel-parser/src/plugins/estree.js | 4 +- packages/babel-parser/src/plugins/flow.js | 3 +- .../.inner-parens-array-pattern-2/input.js | 1 + .../.inner-parens-array-pattern-2/output.json | 71 +++++++++++++++ .../.inner-parens-object-pattern/input.js | 1 + .../.inner-parens-object-pattern/output.json | 68 ++++++++++++++ .../lhs-parenthesized-assignment/input.js | 1 + .../lhs-parenthesized-assignment/output.json | 91 +++++++++++++++++++ .../lhs-parenthesized-object/input.js | 1 + .../lhs-parenthesized-object/output.json | 68 ++++++++++++++ 11 files changed, 315 insertions(+), 11 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-object/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-object/output.json diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 13b4b6b42555..bb4c951709e5 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -99,7 +99,7 @@ export default class LValParser extends NodeUtils { ) { const prop = node.properties[i]; const isLast = i === last; - this.toAssignableObjectExpressionProp(prop, isLast); + this.toAssignableObjectExpressionProp(prop, isLast, isLHS); if ( isLast && @@ -112,8 +112,7 @@ export default class LValParser extends NodeUtils { break; case "ObjectProperty": - // ObjectProperty is not allowed in LHS - this.toAssignable(node.value); + this.toAssignable(node.value, isLHS); break; case "SpreadElement": { @@ -137,8 +136,7 @@ export default class LValParser extends NodeUtils { node.type = "AssignmentPattern"; delete node.operator; - // AssignmentPattern is not allowed in LHS - this.toAssignable(node.left); + this.toAssignable(node.left, isLHS); break; case "ParenthesizedExpression": @@ -153,7 +151,11 @@ export default class LValParser extends NodeUtils { return node; } - toAssignableObjectExpressionProp(prop: Node, isLast: boolean) { + toAssignableObjectExpressionProp( + prop: Node, + isLast: boolean, + isLHS: boolean, + ) { if (prop.type === "ObjectMethod") { const error = prop.kind === "get" || prop.kind === "set" @@ -166,8 +168,7 @@ export default class LValParser extends NodeUtils { } else if (prop.type === "SpreadElement" && !isLast) { this.raiseRestNotLast(prop.start); } else { - // ObjectPattern is not allowed in LHS - this.toAssignable(prop); + this.toAssignable(prop, isLHS); } } diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 8111cd2891e3..f520ae2c9db4 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -351,13 +351,13 @@ export default (superClass: Class): Class => return super.toAssignable(node, isLHS); } - toAssignableObjectExpressionProp(prop: N.Node, isLast: boolean) { + toAssignableObjectExpressionProp(prop: N.Node, ...args) { if (prop.kind === "get" || prop.kind === "set") { throw this.raise(prop.key.start, Errors.PatternHasAccessor); } else if (prop.method) { throw this.raise(prop.key.start, Errors.PatternHasMethod); } else { - super.toAssignableObjectExpressionProp(prop, isLast); + super.toAssignableObjectExpressionProp(prop, ...args); } } diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index e14638301a63..a02102a2ad9c 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -1955,6 +1955,7 @@ export default (superClass: Class): Class => // has not been converted yet. ((node.params: any): N.Expression[]), node.extra?.trailingComma, + /* isLHS */ false, ); // Enter scope, as checkParams defines bindings this.scope.enter(SCOPE_FUNCTION | SCOPE_ARROW); @@ -2204,7 +2205,7 @@ export default (superClass: Class): Class => toAssignableList( exprList: N.Expression[], trailingCommaPos?: ?number, - isLHS: boolean = true, + isLHS: boolean, ): $ReadOnlyArray { for (let i = 0; i < exprList.length; i++) { const expr = exprList[i]; diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/input.js new file mode 100644 index 000000000000..c87a5386e5d6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/input.js @@ -0,0 +1 @@ +([ [(a)] = [] ] = []) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/output.json new file mode 100644 index 000000000000..7b7ee9fd382d --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/output.json @@ -0,0 +1,71 @@ +{ + "type": "File", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "program": { + "type": "Program", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "AssignmentPattern", + "start":1,"end":20,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":20}}, + "left": { + "type": "ArrayPattern", + "start":1,"end":15,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":15}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":3,"end":13,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":13}}, + "left": { + "type": "ArrayPattern", + "start":3,"end":8,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":8}}, + "elements": [ + { + "type": "Identifier", + "start":5,"end":6,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":6},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 4 + }, + "name": "a" + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":11,"end":13,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":13}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":18,"end":20,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":20}}, + "elements": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":25,"end":27,"loc":{"start":{"line":1,"column":25},"end":{"line":1,"column":27}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/input.js new file mode 100644 index 000000000000..009433301e2c --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/input.js @@ -0,0 +1 @@ +({ a: (foo) } = {}) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/output.json new file mode 100644 index 000000000000..5877bb92cdf0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/output.json @@ -0,0 +1,68 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "AssignmentPattern", + "start":1,"end":18,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":18}}, + "left": { + "type": "ObjectPattern", + "start":1,"end":13,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":13}}, + "properties": [ + { + "type": "ObjectProperty", + "start":3,"end":11,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":11}}, + "method": false, + "key": { + "type": "Identifier", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "Identifier", + "start":7,"end":10,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":10},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 6 + }, + "name": "foo" + } + } + ] + }, + "right": { + "type": "ObjectExpression", + "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, + "properties": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":23,"end":25,"loc":{"start":{"line":1,"column":23},"end":{"line":1,"column":25}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment/input.js b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment/input.js new file mode 100644 index 000000000000..0fdb1d81c96d --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment/input.js @@ -0,0 +1 @@ +({ a: (a.b) = (c.d) } = {}); diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment/output.json b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment/output.json new file mode 100644 index 000000000000..26d23fd2ab71 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment/output.json @@ -0,0 +1,91 @@ +{ + "type": "File", + "start":0,"end":28,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}}, + "program": { + "type": "Program", + "start":0,"end":28,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":28,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}}, + "expression": { + "type": "AssignmentExpression", + "start":1,"end":26,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":26}}, + "extra": { + "parenthesized": true, + "parenStart": 0 + }, + "operator": "=", + "left": { + "type": "ObjectPattern", + "start":1,"end":21,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":21}}, + "properties": [ + { + "type": "ObjectProperty", + "start":3,"end":19,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":19}}, + "method": false, + "key": { + "type": "Identifier", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "AssignmentPattern", + "start":6,"end":19,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":19}}, + "left": { + "type": "MemberExpression", + "start":7,"end":10,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":10}}, + "extra": { + "parenthesized": true, + "parenStart": 6 + }, + "object": { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10},"identifierName":"b"}, + "name": "b" + } + }, + "right": { + "type": "MemberExpression", + "start":15,"end":18,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":18}}, + "extra": { + "parenthesized": true, + "parenStart": 14 + }, + "object": { + "type": "Identifier", + "start":15,"end":16,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":16},"identifierName":"c"}, + "name": "c" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":17,"end":18,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":18},"identifierName":"d"}, + "name": "d" + } + } + } + } + ] + }, + "right": { + "type": "ObjectExpression", + "start":24,"end":26,"loc":{"start":{"line":1,"column":24},"end":{"line":1,"column":26}}, + "properties": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-object/input.js b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-object/input.js new file mode 100644 index 000000000000..5093d4e7afd0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-object/input.js @@ -0,0 +1 @@ +({ a: (a.b) } = {}); diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-object/output.json b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-object/output.json new file mode 100644 index 000000000000..8e08d2747603 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-object/output.json @@ -0,0 +1,68 @@ +{ + "type": "File", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "program": { + "type": "Program", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "expression": { + "type": "AssignmentExpression", + "start":1,"end":18,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":18}}, + "extra": { + "parenthesized": true, + "parenStart": 0 + }, + "operator": "=", + "left": { + "type": "ObjectPattern", + "start":1,"end":13,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":13}}, + "properties": [ + { + "type": "ObjectProperty", + "start":3,"end":11,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":11}}, + "method": false, + "key": { + "type": "Identifier", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "MemberExpression", + "start":7,"end":10,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":10}}, + "extra": { + "parenthesized": true, + "parenStart": 6 + }, + "object": { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10},"identifierName":"b"}, + "name": "b" + } + } + } + ] + }, + "right": { + "type": "ObjectExpression", + "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, + "properties": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file From 00a776c34df0248bf4858fd47faa6c9772ae02c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 9 Nov 2020 11:53:03 -0500 Subject: [PATCH 6/9] fix: record parenthesized identifier error for LHS --- packages/babel-parser/src/parser/lval.js | 22 +++-- .../babel-parser/src/util/expression-scope.js | 21 +++++ .../inner-parens-array-pattern-2/input.js | 1 + .../inner-parens-array-pattern-2/output.json | 74 +++++++++++++++++ .../inner-parens-array-pattern-3/input.js | 1 + .../inner-parens-array-pattern-3/output.json | 68 ++++++++++++++++ .../input.js | 1 + .../output.json | 81 +++++++++++++++++++ .../inner-parens-object-pattern/input.js | 1 + .../inner-parens-object-pattern/output.json | 71 ++++++++++++++++ .../lhs-parenthesized-assignment-2/input.js | 1 + .../output.json | 55 +++++++++++++ .../input.js | 1 + .../output.json | 68 ++++++++++++++++ .../input.js | 1 + .../output.json | 74 +++++++++++++++++ .../input.js | 0 .../output.json | 0 .../input.js | 1 + .../output.json | 78 ++++++++++++++++++ .../parenthesized-binding-pattern}/input.js | 0 .../output.json | 0 .../parenthesized-rest-array}/input.js | 0 .../parenthesized-rest-array}/output.json | 0 .../parenthesized-rest-object}/input.js | 0 .../parenthesized-rest-object}/output.json | 0 .../input.js | 1 + .../output.json | 72 +++++++++++++++++ .../input.js | 1 + .../output.json | 62 ++++++++++++++ .../parenthesized-argument-array/input.js | 1 + .../parenthesized-argument-array/output.json | 55 +++++++++++++ .../input.js | 1 + .../output.json | 49 +++++++++++ .../parenthesized-call-expression/input.js | 1 + .../parenthesized-call-expression/output.json | 72 +++++++++++++++++ .../parenthesized-spread-array/input.js | 1 + .../parenthesized-spread-array/output.json | 59 ++++++++++++++ .../parenthesized-spread-object/input.js | 1 + .../parenthesized-spread-object/output.json | 59 ++++++++++++++ 40 files changed, 1050 insertions(+), 5 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-2/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-2/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-3/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-3/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern-member/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern-member/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment-2/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment-2/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested-2/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested-2/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested/output.json rename packages/babel-parser/test/fixtures/es2017/{async-functions/parenthesized-async-arrow-binding-identifier => async-arrow/parenthesized-binding-identifier}/input.js (100%) rename packages/babel-parser/test/fixtures/es2017/{async-functions/parenthesized-async-arrow-binding-identifier => async-arrow/parenthesized-binding-identifier}/output.json (100%) create mode 100644 packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-member-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-member-expression/output.json rename packages/babel-parser/test/fixtures/es2017/{async-functions/parenthesized-async-arrow-binding-pattern => async-arrow/parenthesized-binding-pattern}/input.js (100%) rename packages/babel-parser/test/fixtures/es2017/{async-functions/parenthesized-async-arrow-binding-pattern => async-arrow/parenthesized-binding-pattern}/output.json (100%) rename packages/babel-parser/test/fixtures/es2017/{async-functions/parenthesized-async-arrow-rest-array => async-arrow/parenthesized-rest-array}/input.js (100%) rename packages/babel-parser/test/fixtures/es2017/{async-functions/parenthesized-async-arrow-rest-array => async-arrow/parenthesized-rest-array}/output.json (100%) rename packages/babel-parser/test/fixtures/es2017/{async-functions/parenthesized-async-arrow-rest-object => async-arrow/parenthesized-rest-object}/input.js (100%) rename packages/babel-parser/test/fixtures/es2017/{async-functions/parenthesized-async-arrow-rest-object => async-arrow/parenthesized-rest-object}/output.json (100%) create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs-member/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs-member/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-identifier/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-identifier/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-call-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-call-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-array/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-array/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-object/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-object/output.json diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index bb4c951709e5..c3f4e8b018d7 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -74,11 +74,23 @@ export default class LValParser extends NodeUtils { let parenthesized = undefined; if (node.type === "ParenthesizedExpression" || node.extra?.parenthesized) { parenthesized = unwrapParenthesizedExpression(node); - if ( - !isLHS || - (parenthesized.type !== "Identifier" && - parenthesized.type !== "MemberExpression") - ) { + if (isLHS) { + // an LHS can be reinterpreted to a binding pattern but not vice versa. + // therefore a parenthesized identifier is ambiguous until we are sure it is an assignment expression + // i.e. `([(a) = []] = []) => {}` + // see also `recordParenthesizedIdentifierError` signature in packages/babel-parser/src/util/expression-scope.js + if (parenthesized.type === "Identifier") { + this.expressionScope.recordParenthesizedIdentifierError( + node.start, + Errors.InvalidParenthesizedAssignment, + ); + } else if (parenthesized.type !== "MemberExpression") { + // A parenthesized member expression can be in LHS but not in pattern. + // If the LHS is later interpreted as a pattern, `checkLVal` will throw for member expression binding + // i.e. `([(a.b) = []] = []) => {}` + this.raise(node.start, Errors.InvalidParenthesizedAssignment); + } + } else { this.raise(node.start, Errors.InvalidParenthesizedAssignment); } } diff --git a/packages/babel-parser/src/util/expression-scope.js b/packages/babel-parser/src/util/expression-scope.js index bc0e940fa2b1..374a0a974501 100644 --- a/packages/babel-parser/src/util/expression-scope.js +++ b/packages/babel-parser/src/util/expression-scope.js @@ -20,6 +20,7 @@ some expression scopes and thrown later when we know what the ambigous pattern i - AwaitBindingIdentifier - AwaitExpressionFormalParameter - YieldInParameter +- InvalidParenthesizedAssignment when parenthesized is an identifier There are four different expression scope - Expression @@ -130,6 +131,26 @@ export default class ExpressionScopeHandler { /* eslint-disable @babel/development-internal/dry-error-messages */ this.raise(pos, message); } + + /** + * Record parenthesized identifier errors + * + * A parenthesized identifier in LHS can be ambiguous because the assignment + * can be transformed to an assignable later, but not vice versa: + * For example, in `([(a) = []] = []) => {}`, we think `(a) = []` is an LHS in `[(a) = []]`, + * an LHS within `[(a) = []] = []`. However the LHS chain is then transformed by toAssignable, + * and we should throw assignment `(a)`, which is only valid in LHS. Hence we record the + * location of parenthesized `(a)` to any ancestry MaybeArrowParameterDeclaration + * and MaybeAsyncArrowParameterDeclaration scope until an Expression scope is seen + * @param {number} pos + * @param {string} message + * @returns {void} + * @memberof ExpressionScopeHandler + */ + recordParenthesizedIdentifierError(pos: number, message: string): void { + return this.recordParameterInitializerError(pos, message); + } + /** * Record likely async arrow parameter errors * diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-2/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-2/input.js new file mode 100644 index 000000000000..c87a5386e5d6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-2/input.js @@ -0,0 +1 @@ +([ [(a)] = [] ] = []) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-2/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-2/output.json new file mode 100644 index 000000000000..9f5e348e9980 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-2/output.json @@ -0,0 +1,74 @@ +{ + "type": "File", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:5)" + ], + "program": { + "type": "Program", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "AssignmentPattern", + "start":1,"end":20,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":20}}, + "left": { + "type": "ArrayPattern", + "start":1,"end":15,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":15}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":3,"end":13,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":13}}, + "left": { + "type": "ArrayPattern", + "start":3,"end":8,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":8}}, + "elements": [ + { + "type": "Identifier", + "start":5,"end":6,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":6},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 4 + }, + "name": "a" + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":11,"end":13,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":13}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":18,"end":20,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":20}}, + "elements": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":25,"end":27,"loc":{"start":{"line":1,"column":25},"end":{"line":1,"column":27}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-3/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-3/input.js new file mode 100644 index 000000000000..1604212276b2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-3/input.js @@ -0,0 +1 @@ +([(a) = [] ] = []) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-3/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-3/output.json new file mode 100644 index 000000000000..5283e2a52a8b --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-array-pattern-3/output.json @@ -0,0 +1,68 @@ +{ + "type": "File", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:3)" + ], + "program": { + "type": "Program", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "AssignmentPattern", + "start":1,"end":17,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":17}}, + "left": { + "type": "ArrayPattern", + "start":1,"end":12,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":12}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":2,"end":10,"loc":{"start":{"line":1,"column":2},"end":{"line":1,"column":10}}, + "left": { + "type": "Identifier", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 2 + }, + "name": "a" + }, + "right": { + "type": "ArrayExpression", + "start":8,"end":10,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":10}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":15,"end":17,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":17}}, + "elements": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":22,"end":24,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":24}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern-member/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern-member/input.js new file mode 100644 index 000000000000..7e1a5bcba10e --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern-member/input.js @@ -0,0 +1 @@ +({ a: (foo.qux) } = {}) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern-member/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern-member/output.json new file mode 100644 index 000000000000..e211f20e7d7f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern-member/output.json @@ -0,0 +1,81 @@ +{ + "type": "File", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "errors": [ + "SyntaxError: Binding member expression (1:7)" + ], + "program": { + "type": "Program", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "AssignmentPattern", + "start":1,"end":22,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":22}}, + "left": { + "type": "ObjectPattern", + "start":1,"end":17,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":17}}, + "properties": [ + { + "type": "ObjectProperty", + "start":3,"end":15,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":15}}, + "method": false, + "key": { + "type": "Identifier", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "MemberExpression", + "start":7,"end":14,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":14}}, + "extra": { + "parenthesized": true, + "parenStart": 6 + }, + "object": { + "type": "Identifier", + "start":7,"end":10,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":10},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":11,"end":14,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":14},"identifierName":"qux"}, + "name": "qux" + } + } + } + ] + }, + "right": { + "type": "ObjectExpression", + "start":20,"end":22,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":22}}, + "properties": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":27,"end":29,"loc":{"start":{"line":1,"column":27},"end":{"line":1,"column":29}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern/input.js new file mode 100644 index 000000000000..009433301e2c --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern/input.js @@ -0,0 +1 @@ +({ a: (foo) } = {}) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern/output.json new file mode 100644 index 000000000000..0749c0ba9234 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/inner-parens-object-pattern/output.json @@ -0,0 +1,71 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:7)" + ], + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "AssignmentPattern", + "start":1,"end":18,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":18}}, + "left": { + "type": "ObjectPattern", + "start":1,"end":13,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":13}}, + "properties": [ + { + "type": "ObjectProperty", + "start":3,"end":11,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":11}}, + "method": false, + "key": { + "type": "Identifier", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "Identifier", + "start":7,"end":10,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":10},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 6 + }, + "name": "foo" + } + } + ] + }, + "right": { + "type": "ObjectExpression", + "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, + "properties": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":23,"end":25,"loc":{"start":{"line":1,"column":23},"end":{"line":1,"column":25}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment-2/input.js b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment-2/input.js new file mode 100644 index 000000000000..e22817b95c5a --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment-2/input.js @@ -0,0 +1 @@ +([(a) = [] ] = []); diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment-2/output.json b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment-2/output.json new file mode 100644 index 000000000000..5c65c0eb4706 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/lhs-parenthesized-assignment-2/output.json @@ -0,0 +1,55 @@ +{ + "type": "File", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "program": { + "type": "Program", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "expression": { + "type": "AssignmentExpression", + "start":1,"end":17,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":17}}, + "extra": { + "parenthesized": true, + "parenStart": 0 + }, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":1,"end":12,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":12}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":2,"end":10,"loc":{"start":{"line":1,"column":2},"end":{"line":1,"column":10}}, + "left": { + "type": "Identifier", + "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 2 + }, + "name": "a" + }, + "right": { + "type": "ArrayExpression", + "start":8,"end":10,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":10}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":15,"end":17,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":17}}, + "elements": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested-2/input.js b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested-2/input.js new file mode 100644 index 000000000000..fca3448ee55f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested-2/input.js @@ -0,0 +1 @@ +async ([(a) = []] = []) => {} diff --git a/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested-2/output.json b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested-2/output.json new file mode 100644 index 000000000000..690e665a2c86 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested-2/output.json @@ -0,0 +1,68 @@ +{ + "type": "File", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:9)" + ], + "program": { + "type": "Program", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "AssignmentPattern", + "start":7,"end":22,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":22}}, + "left": { + "type": "ArrayPattern", + "start":7,"end":17,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":17}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":8,"end":16,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":16}}, + "left": { + "type": "Identifier", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 8 + }, + "name": "a" + }, + "right": { + "type": "ArrayExpression", + "start":14,"end":16,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":16}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":20,"end":22,"loc":{"start":{"line":1,"column":20},"end":{"line":1,"column":22}}, + "elements": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":27,"end":29,"loc":{"start":{"line":1,"column":27},"end":{"line":1,"column":29}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested/input.js b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested/input.js new file mode 100644 index 000000000000..068f84519933 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested/input.js @@ -0,0 +1 @@ +async ([ [(a)] = [] ] = []) => {}; diff --git a/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested/output.json b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested/output.json new file mode 100644 index 000000000000..e2758e5bab29 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-array-pattern-nested/output.json @@ -0,0 +1,74 @@ +{ + "type": "File", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}}, + "errors": [ + "SyntaxError: Invalid parenthesized assignment pattern (1:11)" + ], + "program": { + "type": "Program", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "AssignmentPattern", + "start":7,"end":26,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":26}}, + "left": { + "type": "ArrayPattern", + "start":7,"end":21,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":21}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":9,"end":19,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":19}}, + "left": { + "type": "ArrayPattern", + "start":9,"end":14,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":14}}, + "elements": [ + { + "type": "Identifier", + "start":11,"end":12,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":12},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 10 + }, + "name": "a" + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":17,"end":19,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":19}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":24,"end":26,"loc":{"start":{"line":1,"column":24},"end":{"line":1,"column":26}}, + "elements": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":31,"end":33,"loc":{"start":{"line":1,"column":31},"end":{"line":1,"column":33}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/input.js b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-identifier/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/input.js rename to packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-identifier/input.js diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/output.json b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-identifier/output.json similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-identifier/output.json rename to packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-identifier/output.json diff --git a/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-member-expression/input.js b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-member-expression/input.js new file mode 100644 index 000000000000..491fe451a674 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-member-expression/input.js @@ -0,0 +1 @@ +async ([(a.b) = []] = []) => {} diff --git a/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-member-expression/output.json b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-member-expression/output.json new file mode 100644 index 000000000000..9afdf9f5fa55 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-member-expression/output.json @@ -0,0 +1,78 @@ +{ + "type": "File", + "start":0,"end":31,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}}, + "errors": [ + "SyntaxError: Binding member expression (1:9)" + ], + "program": { + "type": "Program", + "start":0,"end":31,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":31,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":31,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "AssignmentPattern", + "start":7,"end":24,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":24}}, + "left": { + "type": "ArrayPattern", + "start":7,"end":19,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":19}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":8,"end":18,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":18}}, + "left": { + "type": "MemberExpression", + "start":9,"end":12,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":12}}, + "extra": { + "parenthesized": true, + "parenStart": 8 + }, + "object": { + "type": "Identifier", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":11,"end":12,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":12},"identifierName":"b"}, + "name": "b" + } + }, + "right": { + "type": "ArrayExpression", + "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":22,"end":24,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":24}}, + "elements": [] + } + } + ], + "body": { + "type": "BlockStatement", + "start":29,"end":31,"loc":{"start":{"line":1,"column":29},"end":{"line":1,"column":31}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/input.js b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-pattern/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/input.js rename to packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-pattern/input.js diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/output.json b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-pattern/output.json similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-binding-pattern/output.json rename to packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-binding-pattern/output.json diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/input.js b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-rest-array/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/input.js rename to packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-rest-array/input.js diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/output.json b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-rest-array/output.json similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-array/output.json rename to packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-rest-array/output.json diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/input.js b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-rest-object/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/input.js rename to packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-rest-object/input.js diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/output.json b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-rest-object/output.json similarity index 100% rename from packages/babel-parser/test/fixtures/es2017/async-functions/parenthesized-async-arrow-rest-object/output.json rename to packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-rest-object/output.json diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs-member/input.js b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs-member/input.js new file mode 100644 index 000000000000..8aebd11a65b2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs-member/input.js @@ -0,0 +1 @@ +async ([(a.b) = [] ] = []); diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs-member/output.json b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs-member/output.json new file mode 100644 index 000000000000..539f3f151e57 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs-member/output.json @@ -0,0 +1,72 @@ +{ + "type": "File", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "program": { + "type": "Program", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, + "expression": { + "type": "CallExpression", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "callee": { + "type": "Identifier", + "start":0,"end":5,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":5},"identifierName":"async"}, + "name": "async" + }, + "arguments": [ + { + "type": "AssignmentExpression", + "start":7,"end":25,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":25}}, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":7,"end":20,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":20}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":8,"end":18,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":18}}, + "left": { + "type": "MemberExpression", + "start":9,"end":12,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":12}}, + "extra": { + "parenthesized": true, + "parenStart": 8 + }, + "object": { + "type": "Identifier", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":11,"end":12,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":12},"identifierName":"b"}, + "name": "b" + } + }, + "right": { + "type": "ArrayExpression", + "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":23,"end":25,"loc":{"start":{"line":1,"column":23},"end":{"line":1,"column":25}}, + "elements": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs/input.js b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs/input.js new file mode 100644 index 000000000000..e6a22fb37ecd --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs/input.js @@ -0,0 +1 @@ +async ([(a) = [] ] = []); diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs/output.json b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs/output.json new file mode 100644 index 000000000000..695ec8ee601a --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array-pattern-lhs/output.json @@ -0,0 +1,62 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "expression": { + "type": "CallExpression", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "callee": { + "type": "Identifier", + "start":0,"end":5,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":5},"identifierName":"async"}, + "name": "async" + }, + "arguments": [ + { + "type": "AssignmentExpression", + "start":7,"end":23,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":23}}, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":7,"end":18,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":18}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":8,"end":16,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":16}}, + "left": { + "type": "Identifier", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10},"identifierName":"a"}, + "extra": { + "parenthesized": true, + "parenStart": 8 + }, + "name": "a" + }, + "right": { + "type": "ArrayExpression", + "start":14,"end":16,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":16}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":21,"end":23,"loc":{"start":{"line":1,"column":21},"end":{"line":1,"column":23}}, + "elements": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array/input.js b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array/input.js new file mode 100644 index 000000000000..47c0427c5416 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array/input.js @@ -0,0 +1 @@ +var foo = async ([(foo)]); diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array/output.json b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array/output.json new file mode 100644 index 000000000000..05e7ace21e7a --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-array/output.json @@ -0,0 +1,55 @@ +{ + "type": "File", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "program": { + "type": "Program", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":25,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":25}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "CallExpression", + "start":10,"end":25,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":25}}, + "callee": { + "type": "Identifier", + "start":10,"end":15,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":15},"identifierName":"async"}, + "name": "async" + }, + "arguments": [ + { + "type": "ArrayExpression", + "start":17,"end":24,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":24}}, + "elements": [ + { + "type": "Identifier", + "start":19,"end":22,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":22},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 18 + }, + "name": "foo" + } + ] + } + ] + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-identifier/input.js b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-identifier/input.js new file mode 100644 index 000000000000..beacdc83daf4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-identifier/input.js @@ -0,0 +1 @@ +var foo = async ((foo)); diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-identifier/output.json b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-identifier/output.json new file mode 100644 index 000000000000..a93ad5c761a8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-argument-identifier/output.json @@ -0,0 +1,49 @@ +{ + "type": "File", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "program": { + "type": "Program", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":23,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":23}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "CallExpression", + "start":10,"end":23,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":23}}, + "callee": { + "type": "Identifier", + "start":10,"end":15,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":15},"identifierName":"async"}, + "name": "async" + }, + "arguments": [ + { + "type": "Identifier", + "start":18,"end":21,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":21},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 17 + }, + "name": "foo" + } + ] + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-call-expression/input.js b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-call-expression/input.js new file mode 100644 index 000000000000..a2ac8f1cf499 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-call-expression/input.js @@ -0,0 +1 @@ +async ([(a.b) = []] = []); diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-call-expression/output.json b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-call-expression/output.json new file mode 100644 index 000000000000..f9755098f1c9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-call-expression/output.json @@ -0,0 +1,72 @@ +{ + "type": "File", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "program": { + "type": "Program", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}}, + "expression": { + "type": "CallExpression", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "callee": { + "type": "Identifier", + "start":0,"end":5,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":5},"identifierName":"async"}, + "name": "async" + }, + "arguments": [ + { + "type": "AssignmentExpression", + "start":7,"end":24,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":24}}, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":7,"end":19,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":19}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":8,"end":18,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":18}}, + "left": { + "type": "MemberExpression", + "start":9,"end":12,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":12}}, + "extra": { + "parenthesized": true, + "parenStart": 8 + }, + "object": { + "type": "Identifier", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10},"identifierName":"a"}, + "name": "a" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":11,"end":12,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":12},"identifierName":"b"}, + "name": "b" + } + }, + "right": { + "type": "ArrayExpression", + "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":22,"end":24,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":24}}, + "elements": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-array/input.js b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-array/input.js new file mode 100644 index 000000000000..7d1e6dc53d0f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-array/input.js @@ -0,0 +1 @@ +var foo = async ([...(foo)]); diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-array/output.json b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-array/output.json new file mode 100644 index 000000000000..12cf4c814637 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-array/output.json @@ -0,0 +1,59 @@ +{ + "type": "File", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "program": { + "type": "Program", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":28,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":28}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "CallExpression", + "start":10,"end":28,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":28}}, + "callee": { + "type": "Identifier", + "start":10,"end":15,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":15},"identifierName":"async"}, + "name": "async" + }, + "arguments": [ + { + "type": "ArrayExpression", + "start":17,"end":27,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":27}}, + "elements": [ + { + "type": "SpreadElement", + "start":18,"end":26,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":26}}, + "argument": { + "type": "Identifier", + "start":22,"end":25,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":25},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 21 + }, + "name": "foo" + } + } + ] + } + ] + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-object/input.js b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-object/input.js new file mode 100644 index 000000000000..d4e92942f12c --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-object/input.js @@ -0,0 +1 @@ +var foo = async ({...(foo)}); diff --git a/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-object/output.json b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-object/output.json new file mode 100644 index 000000000000..8edeffd62ea9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-call/parenthesized-spread-object/output.json @@ -0,0 +1,59 @@ +{ + "type": "File", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "program": { + "type": "Program", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":28,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":28}}, + "id": { + "type": "Identifier", + "start":4,"end":7,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":7},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "CallExpression", + "start":10,"end":28,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":28}}, + "callee": { + "type": "Identifier", + "start":10,"end":15,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":15},"identifierName":"async"}, + "name": "async" + }, + "arguments": [ + { + "type": "ObjectExpression", + "start":17,"end":27,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":27}}, + "properties": [ + { + "type": "SpreadElement", + "start":18,"end":26,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":26}}, + "argument": { + "type": "Identifier", + "start":22,"end":25,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":25},"identifierName":"foo"}, + "extra": { + "parenthesized": true, + "parenStart": 21 + }, + "name": "foo" + } + } + ] + } + ] + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file From e9c207033fedf527c1502782bbb698e8c5dae0c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 9 Nov 2020 12:03:45 -0500 Subject: [PATCH 7/9] remove duplicated skipped tests --- .../.inner-parens-array-pattern-2/input.js | 1 - .../.inner-parens-array-pattern-2/output.json | 71 ------------------- .../.inner-parens-object-pattern/input.js | 1 - .../.inner-parens-object-pattern/output.json | 68 ------------------ 4 files changed, 141 deletions(-) delete mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/input.js delete mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/output.json delete mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/input.js delete mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/output.json diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/input.js deleted file mode 100644 index c87a5386e5d6..000000000000 --- a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/input.js +++ /dev/null @@ -1 +0,0 @@ -([ [(a)] = [] ] = []) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/output.json deleted file mode 100644 index 7b7ee9fd382d..000000000000 --- a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-array-pattern-2/output.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "type": "File", - "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, - "program": { - "type": "Program", - "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, - "sourceType": "script", - "interpreter": null, - "body": [ - { - "type": "ExpressionStatement", - "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, - "expression": { - "type": "ArrowFunctionExpression", - "start":0,"end":27,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}}, - "id": null, - "generator": false, - "async": false, - "params": [ - { - "type": "AssignmentPattern", - "start":1,"end":20,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":20}}, - "left": { - "type": "ArrayPattern", - "start":1,"end":15,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":15}}, - "elements": [ - { - "type": "AssignmentPattern", - "start":3,"end":13,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":13}}, - "left": { - "type": "ArrayPattern", - "start":3,"end":8,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":8}}, - "elements": [ - { - "type": "Identifier", - "start":5,"end":6,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":6},"identifierName":"a"}, - "extra": { - "parenthesized": true, - "parenStart": 4 - }, - "name": "a" - } - ] - }, - "right": { - "type": "ArrayExpression", - "start":11,"end":13,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":13}}, - "elements": [] - } - } - ] - }, - "right": { - "type": "ArrayExpression", - "start":18,"end":20,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":20}}, - "elements": [] - } - } - ], - "body": { - "type": "BlockStatement", - "start":25,"end":27,"loc":{"start":{"line":1,"column":25},"end":{"line":1,"column":27}}, - "body": [], - "directives": [] - } - } - } - ], - "directives": [] - } -} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/input.js deleted file mode 100644 index 009433301e2c..000000000000 --- a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/input.js +++ /dev/null @@ -1 +0,0 @@ -({ a: (foo) } = {}) => {} diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/output.json deleted file mode 100644 index 5877bb92cdf0..000000000000 --- a/packages/babel-parser/test/fixtures/es2015/arrow-functions/.inner-parens-object-pattern/output.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "type": "File", - "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, - "program": { - "type": "Program", - "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, - "sourceType": "script", - "interpreter": null, - "body": [ - { - "type": "ExpressionStatement", - "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, - "expression": { - "type": "ArrowFunctionExpression", - "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, - "id": null, - "generator": false, - "async": false, - "params": [ - { - "type": "AssignmentPattern", - "start":1,"end":18,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":18}}, - "left": { - "type": "ObjectPattern", - "start":1,"end":13,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":13}}, - "properties": [ - { - "type": "ObjectProperty", - "start":3,"end":11,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":11}}, - "method": false, - "key": { - "type": "Identifier", - "start":3,"end":4,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":4},"identifierName":"a"}, - "name": "a" - }, - "computed": false, - "shorthand": false, - "value": { - "type": "Identifier", - "start":7,"end":10,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":10},"identifierName":"foo"}, - "extra": { - "parenthesized": true, - "parenStart": 6 - }, - "name": "foo" - } - } - ] - }, - "right": { - "type": "ObjectExpression", - "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, - "properties": [] - } - } - ], - "body": { - "type": "BlockStatement", - "start":23,"end":25,"loc":{"start":{"line":1,"column":23},"end":{"line":1,"column":25}}, - "body": [], - "directives": [] - } - } - } - ], - "directives": [] - } -} \ No newline at end of file From 64b923640db8c6e7be8272f515b1b9a336017f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 9 Nov 2020 14:46:03 -0500 Subject: [PATCH 8/9] fix: do not record errors on ancestry arrow head --- .../babel-parser/src/util/expression-scope.js | 21 ++++- .../input.js | 1 + .../output.json | 79 +++++++++++++++++++ .../input.js | 1 + .../output.json | 77 ++++++++++++++++++ 5 files changed, 176 insertions(+), 3 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/parenthesized-lhs-in-parethesis-in-param/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/arrow-functions/parenthesized-lhs-in-parethesis-in-param/output.json create mode 100644 packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-lhs-in-async-call-in-param/input.js create mode 100644 packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-lhs-in-async-call-in-param/output.json diff --git a/packages/babel-parser/src/util/expression-scope.js b/packages/babel-parser/src/util/expression-scope.js index 374a0a974501..815506691203 100644 --- a/packages/babel-parser/src/util/expression-scope.js +++ b/packages/babel-parser/src/util/expression-scope.js @@ -140,15 +140,30 @@ export default class ExpressionScopeHandler { * For example, in `([(a) = []] = []) => {}`, we think `(a) = []` is an LHS in `[(a) = []]`, * an LHS within `[(a) = []] = []`. However the LHS chain is then transformed by toAssignable, * and we should throw assignment `(a)`, which is only valid in LHS. Hence we record the - * location of parenthesized `(a)` to any ancestry MaybeArrowParameterDeclaration - * and MaybeAsyncArrowParameterDeclaration scope until an Expression scope is seen + * location of parenthesized `(a)` to current scope if it is one of MaybeArrowParameterDeclaration + * and MaybeAsyncArrowParameterDeclaration + * + * Unlike `recordParameterInitializerError`, we don't record to ancestry scope because we + * validate arrow head parsing scope before exit, and then the LHS will be unambiguous: + * For example, in `( x = ( [(a) = []] = [] ) ) => {}`, we should not record `(a)` in `( x = ... ) =>` + * arrow scope because when we finish parsing `( [(a) = []] = [] )`, it is an umbiguous assignment + * expression and can not be cast to pattern * @param {number} pos * @param {string} message * @returns {void} * @memberof ExpressionScopeHandler */ recordParenthesizedIdentifierError(pos: number, message: string): void { - return this.recordParameterInitializerError(pos, message); + const { stack } = this; + const scope: ExpressionScope = stack[stack.length - 1]; + if (scope.isCertainlyParameterDeclaration()) { + this.raise(pos, message); + } else if (scope.canBeArrowParameterDeclaration()) { + /*:: invariant(scope instanceof ArrowHeadParsingScope) */ + scope.recordDeclarationError(pos, message); + } else { + return; + } } /** diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/parenthesized-lhs-in-parethesis-in-param/input.js b/packages/babel-parser/test/fixtures/es2015/arrow-functions/parenthesized-lhs-in-parethesis-in-param/input.js new file mode 100644 index 000000000000..7892d319adb0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/parenthesized-lhs-in-parethesis-in-param/input.js @@ -0,0 +1 @@ +(x = ([(f) = []] = [])) => {}; diff --git a/packages/babel-parser/test/fixtures/es2015/arrow-functions/parenthesized-lhs-in-parethesis-in-param/output.json b/packages/babel-parser/test/fixtures/es2015/arrow-functions/parenthesized-lhs-in-parethesis-in-param/output.json new file mode 100644 index 000000000000..6626adc706ca --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/arrow-functions/parenthesized-lhs-in-parethesis-in-param/output.json @@ -0,0 +1,79 @@ +{ + "type": "File", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}}, + "program": { + "type": "Program", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":30,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}}, + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "AssignmentPattern", + "start":1,"end":22,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":22}}, + "left": { + "type": "Identifier", + "start":1,"end":2,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":2},"identifierName":"x"}, + "name": "x" + }, + "right": { + "type": "AssignmentExpression", + "start":6,"end":21,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":21}}, + "extra": { + "parenthesized": true, + "parenStart": 5 + }, + "operator": "=", + "left": { + "type": "ArrayPattern", + "start":6,"end":16,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":16}}, + "elements": [ + { + "type": "AssignmentPattern", + "start":7,"end":15,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":15}}, + "left": { + "type": "Identifier", + "start":8,"end":9,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":9},"identifierName":"f"}, + "extra": { + "parenthesized": true, + "parenStart": 7 + }, + "name": "f" + }, + "right": { + "type": "ArrayExpression", + "start":13,"end":15,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":15}}, + "elements": [] + } + } + ] + }, + "right": { + "type": "ArrayExpression", + "start":19,"end":21,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":21}}, + "elements": [] + } + } + } + ], + "body": { + "type": "BlockStatement", + "start":27,"end":29,"loc":{"start":{"line":1,"column":27},"end":{"line":1,"column":29}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-lhs-in-async-call-in-param/input.js b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-lhs-in-async-call-in-param/input.js new file mode 100644 index 000000000000..da15aa9e528f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-lhs-in-async-call-in-param/input.js @@ -0,0 +1 @@ +async (x = async([(f) = []])) => {}; diff --git a/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-lhs-in-async-call-in-param/output.json b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-lhs-in-async-call-in-param/output.json new file mode 100644 index 000000000000..acf951ea057a --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2017/async-arrow/parenthesized-lhs-in-async-call-in-param/output.json @@ -0,0 +1,77 @@ +{ + "type": "File", + "start":0,"end":36,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}}, + "program": { + "type": "Program", + "start":0,"end":36,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":36,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}}, + "expression": { + "type": "ArrowFunctionExpression", + "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}, + "id": null, + "generator": false, + "async": true, + "params": [ + { + "type": "AssignmentPattern", + "start":7,"end":28,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":28}}, + "left": { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"x"}, + "name": "x" + }, + "right": { + "type": "CallExpression", + "start":11,"end":28,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":28}}, + "callee": { + "type": "Identifier", + "start":11,"end":16,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":16},"identifierName":"async"}, + "name": "async" + }, + "arguments": [ + { + "type": "ArrayExpression", + "start":17,"end":27,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":27}}, + "elements": [ + { + "type": "AssignmentExpression", + "start":18,"end":26,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":26}}, + "operator": "=", + "left": { + "type": "Identifier", + "start":19,"end":20,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":20},"identifierName":"f"}, + "extra": { + "parenthesized": true, + "parenStart": 18 + }, + "name": "f" + }, + "right": { + "type": "ArrayExpression", + "start":24,"end":26,"loc":{"start":{"line":1,"column":24},"end":{"line":1,"column":26}}, + "elements": [] + } + } + ] + } + ] + } + } + ], + "body": { + "type": "BlockStatement", + "start":33,"end":35,"loc":{"start":{"line":1,"column":33},"end":{"line":1,"column":35}}, + "body": [], + "directives": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file From 46de321240cc477fb7adceb3f58190e0eaa25c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Tue, 10 Nov 2020 09:46:09 -0500 Subject: [PATCH 9/9] Update packages/babel-parser/src/util/expression-scope.js Co-authored-by: Brian Ng --- packages/babel-parser/src/util/expression-scope.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-parser/src/util/expression-scope.js b/packages/babel-parser/src/util/expression-scope.js index 815506691203..809995864000 100644 --- a/packages/babel-parser/src/util/expression-scope.js +++ b/packages/babel-parser/src/util/expression-scope.js @@ -146,7 +146,7 @@ export default class ExpressionScopeHandler { * Unlike `recordParameterInitializerError`, we don't record to ancestry scope because we * validate arrow head parsing scope before exit, and then the LHS will be unambiguous: * For example, in `( x = ( [(a) = []] = [] ) ) => {}`, we should not record `(a)` in `( x = ... ) =>` - * arrow scope because when we finish parsing `( [(a) = []] = [] )`, it is an umbiguous assignment + * arrow scope because when we finish parsing `( [(a) = []] = [] )`, it is an unambiguous assignment * expression and can not be cast to pattern * @param {number} pos * @param {string} message