Skip to content

Commit

Permalink
Do not report invalid lhs in toAssignable
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolo-ribaudo committed Aug 24, 2019
1 parent d29d917 commit fd9ca7c
Show file tree
Hide file tree
Showing 44 changed files with 66 additions and 83 deletions.
51 changes: 43 additions & 8 deletions packages/babel-parser/src/parser/lval.js
Expand Up @@ -85,6 +85,7 @@ export default class LValParser extends NodeUtils {
if (node.operator === "=") {
node.type = "AssignmentPattern";
delete node.operator;
this.toAssignable(node.left, isBinding, contextDescription);
} else {
this.raise(
node.left.end,
Expand All @@ -104,14 +105,9 @@ export default class LValParser extends NodeUtils {
case "MemberExpression":
if (!isBinding) break;

default: {
const message =
"Invalid left-hand side" +
(contextDescription
? " in " + contextDescription
: /* istanbul ignore next */ "expression");
this.raise(node.start, message);
}
default:
// We don't know to do with this node. It will
// be reported by a later call to checkLVal
}
}
return node;
Expand Down Expand Up @@ -175,6 +171,45 @@ export default class LValParser extends NodeUtils {
return exprList;
}

isAssignable(node: Node, isBinding?: boolean) {
switch (node.type) {
case "Identifier":
case "ObjectPattern":
case "ArrayPattern":
case "AssignmentPattern":
return true;

case "ObjectExpression": {
const last = node.properties.length - 1;
return node.properties.every((prop, i) => {
return (
prop.type !== "ObjectMethod" &&
(i === last || prop.type === "SpreadElement") &&
this.isAssignable(prop)
);
});
}

case "ObjectProperty":
return this.isAssignable(node.value);

case "SpreadElement":
return this.isAssignable(node.argument);

case "ArrayExpression":
return node.elements.every(element => this.isAssignable(element));

case "AssignmentExpression":
return node.operator === "=";

case "ParenthesizedExpression":
return this.isAssignable(node.expression);

case "MemberExpression":
return !isBinding;
}
}

// Convert list of expression atoms to a list of

toReferencedList(
Expand Down
54 changes: 23 additions & 31 deletions packages/babel-parser/src/plugins/flow.js
Expand Up @@ -1735,10 +1735,10 @@ export default (superClass: Class<Parser>): Class<Parser> =>
this.state.noArrowAt = noArrowAt.concat(valid[0].start);
({ consequent, failed } = this.tryParseConditionalConsequent());
}

this.getArrowLikeExpressions(consequent, true);
}

this.getArrowLikeExpressions(consequent, true);

this.state.noArrowAt = originalNoArrowAt;
this.expect(tt.colon);

Expand Down Expand Up @@ -1784,18 +1784,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
if (node.type === "ArrowFunctionExpression") {
if (node.typeParameters || !node.returnType) {
// This is an arrow expression without ambiguity, so check its parameters
this.toAssignableList(
// node.params is Expression[] instead of $ReadOnlyArray<Pattern> because it
// has not been converted yet.
((node.params: any): N.Expression[]),
true,
"arrow function parameters",
);
// Enter scope, as checkParams defines bindings
this.scope.enter(functionFlags(false, false) | SCOPE_ARROW);
// Use super's method to force the parameters to be checked
super.checkParams(node, false, true);
this.scope.exit();
this.finishArrowValidation(node);
} else {
arrows.push(node);
}
Expand All @@ -1807,26 +1796,29 @@ export default (superClass: Class<Parser>): Class<Parser> =>
}

if (disallowInvalid) {
for (let i = 0; i < arrows.length; i++) {
this.toAssignableList(
((node.params: any): N.Expression[]),
true,
"arrow function parameters",
);
}
arrows.forEach(node => this.finishArrowValidation(node));
return [arrows, []];
}

return partition(arrows, node => {
const result = this.tryParse(() =>
this.toAssignableList(
((node.params: any): N.Expression[]),
true,
"arrow function parameters",
),
);
return !result.error;
});
return partition(arrows, node =>
node.params.every(param => this.isAssignable(param, true)),
);
}

finishArrowValidation(node: N.ArrowFunctionExpression) {
this.toAssignableList(
// node.params is Expression[] instead of $ReadOnlyArray<Pattern> because it
// has not been converted yet.
((node.params: any): N.Expression[]),
true,
"arrow function parameters",
true,
);
// Enter scope, as checkParams defines bindings
this.scope.enter(functionFlags(false, false) | SCOPE_ARROW);
// Use super's method to force the parameters to be checked
super.checkParams(node, false, true);
this.scope.exit();
}

forwardNoArrowParamsConversionAt<T>(node: N.Node, parse: () => T): T {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:0)",
"SyntaxError: Invalid left-hand side in assignment expression (1:0)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:0)",
"SyntaxError: Invalid left-hand side in assignment expression (1:0)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:1)",
"SyntaxError: Invalid left-hand side in assignment expression (1:1)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in for-in statement (1:5)",
"SyntaxError: Invalid left-hand side in for-in statement (1:5)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:0)",
"SyntaxError: Invalid left-hand side in assignment expression (1:0)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:0)",
"SyntaxError: Invalid left-hand side in assignment expression (1:0)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in for-in statement (1:5)",
"SyntaxError: Invalid left-hand side in for-in statement (1:5)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in for-in statement (1:5)",
"SyntaxError: Invalid left-hand side in for-in statement (1:5)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:1)",
"SyntaxError: Invalid left-hand side in array destructuring pattern (1:1)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in object destructuring pattern (1:7)",
"SyntaxError: Invalid left-hand side in object destructuring pattern (1:7)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in arrow function parameters (1:1)",
"SyntaxError: Binding invalid left-hand side in function paramter list (1:1)"
],
"program": {
Expand Down
Expand Up @@ -13,8 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in arrow function parameters (1:1)",
"SyntaxError: Invalid left-hand side in arrow function parameters (1:5)",
"SyntaxError: Binding invalid left-hand side in function paramter list (1:1)",
"SyntaxError: Binding invalid left-hand side in function paramter list (1:5)"
],
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in arrow function parameters (1:3)",
"SyntaxError: Binding invalid left-hand side in array destructuring pattern (1:3)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in arrow function parameters (1:2)",
"SyntaxError: Binding member expression (1:2)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in arrow function parameters (1:2)",
"SyntaxError: Binding member expression (1:2)"
],
"program": {
Expand Down
Expand Up @@ -14,7 +14,6 @@
},
"errors": [
"SyntaxError: Yield cannot be used as name inside a generator function (2:8)",
"SyntaxError: Invalid left-hand side in arrow function parameters (2:8)",
"SyntaxError: Binding invalid left-hand side in function paramter list (2:8)"
],
"program": {
Expand Down
Expand Up @@ -14,7 +14,6 @@
},
"errors": [
"SyntaxError: Yield cannot be used as name inside a generator function (2:3)",
"SyntaxError: Invalid left-hand side in arrow function parameters (2:3)",
"SyntaxError: Binding invalid left-hand side in function paramter list (2:3)"
],
"program": {
Expand Down
Expand Up @@ -14,7 +14,6 @@
},
"errors": [
"SyntaxError: Yield cannot be used as name inside a generator function (2:3)",
"SyntaxError: Invalid left-hand side in arrow function parameters (2:3)",
"SyntaxError: Binding invalid left-hand side in function paramter list (2:3)"
],
"program": {
Expand Down
Expand Up @@ -14,7 +14,6 @@
},
"errors": [
"SyntaxError: Yield cannot be used as name inside a generator function (2:9)",
"SyntaxError: Invalid left-hand side in arrow function parameters (2:9)",
"SyntaxError: Binding invalid left-hand side in function paramter list (2:9)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in object destructuring pattern (1:4)",
"SyntaxError: Binding member expression (1:4)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in object destructuring pattern (1:24)",
"SyntaxError: Binding member expression (1:24)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in object destructuring pattern (1:4)",
"SyntaxError: Invalid left-hand side in object destructuring pattern (1:4)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in object destructuring pattern (1:5)",
"SyntaxError: Invalid left-hand side in object destructuring pattern (1:5)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:1)",
"SyntaxError: Invalid left-hand side in assignment expression (1:1)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in for-of statement (1:5)",
"SyntaxError: Invalid left-hand side in for-of statement (1:5)"
],
"program": {
Expand Down
Expand Up @@ -14,7 +14,6 @@
},
"errors": [
"SyntaxError: Yield cannot be used as name inside a generator function (1:16)",
"SyntaxError: Invalid left-hand side in arrow function parameters (1:16)",
"SyntaxError: Binding invalid left-hand side in function paramter list (1:16)"
],
"program": {
Expand Down
Expand Up @@ -14,7 +14,6 @@
},
"errors": [
"SyntaxError: Yield cannot be used as name inside a generator function (1:25)",
"SyntaxError: Invalid left-hand side in arrow function parameters (1:25)",
"SyntaxError: Binding invalid left-hand side in function paramter list (1:25)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:0)",
"SyntaxError: Invalid left-hand side in assignment expression (1:0)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:0)",
"SyntaxError: Invalid left-hand side in assignment expression (1:0)"
],
"program": {
Expand Down
Expand Up @@ -13,7 +13,6 @@
}
},
"errors": [
"SyntaxError: Invalid left-hand side in assignment expression (1:1)",
"SyntaxError: Invalid left-hand side in assignment expression (1:1)"
],
"program": {
Expand Down

0 comments on commit fd9ca7c

Please sign in to comment.