From 46b53d7308e0ad5d4ba431fb9c2cc52fe1a532d3 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] 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..1a8b7d7b6d08 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, /* isLHS */ false); } } @@ -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 6c0de5314747..ba6544e72ca2 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); } }