Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index 7712fd3dc4539ae5a7d88608b4b9b0e080e4cd18..c991d47ef9d4e550b2511d70baa2d25ea090516f 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -1643,10 +1643,16 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( |
Token::String(Token::ELLIPSIS)); |
classifier->RecordNonSimpleParameter(); |
ExpressionClassifier binding_classifier(this); |
+ // TODO(adamk): The grammar for this is |
+ // BindingIdentifier | BindingPattern, so |
+ // ParseAssignmentExpression is overkill. |
ExpressionT expr = |
ParseAssignmentExpression(true, &binding_classifier, CHECK_OK); |
- classifier->Accumulate(&binding_classifier, |
- ExpressionClassifier::AllProductions); |
+ // This already couldn't be an expression or a pattern, so the |
+ // only remaining possibility is an arrow formal parameter list. |
+ classifier->Accumulate( |
+ &binding_classifier, |
+ ExpressionClassifier::ArrowFormalParametersProduction); |
if (!impl()->IsIdentifier(expr) && !IsValidPattern(expr)) { |
classifier->RecordArrowFormalParametersError( |
Scanner::Location(ellipsis_pos, scanner()->location().end_pos), |
@@ -1733,12 +1739,18 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseExpression( |
// Expression ',' AssignmentExpression |
ExpressionT result; |
+ |
+ // No need to accumulate binding pattern-related errors, since |
+ // an Expression can't be a binding pattern anyway. |
+ static const unsigned kExpressionProductions = |
+ ExpressionClassifier::AllProductions & |
+ ~(ExpressionClassifier::BindingPatternProduction | |
+ ExpressionClassifier::LetPatternProduction); |
{ |
ExpressionClassifier binding_classifier(this); |
result = |
ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK); |
- classifier->Accumulate(&binding_classifier, |
- ExpressionClassifier::AllProductions); |
+ classifier->Accumulate(&binding_classifier, kExpressionProductions); |
} |
bool is_simple_parameter_list = impl()->IsIdentifier(result); |
bool seen_rest = false; |
@@ -1763,14 +1775,15 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseExpression( |
ExpressionUnexpectedToken(classifier); |
BindingPatternUnexpectedToken(classifier); |
Consume(Token::ELLIPSIS); |
+ // TODO(adamk): If is_rest is true we don't need to parse an assignment |
+ // expression, the grammar is BindingIdentifier | BindingPattern. |
seen_rest = is_rest = true; |
} |
int pos = position(), expr_pos = peek_position(); |
ExpressionClassifier binding_classifier(this); |
ExpressionT right = |
ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK); |
- classifier->Accumulate(&binding_classifier, |
- ExpressionClassifier::AllProductions); |
+ classifier->Accumulate(&binding_classifier, kExpressionProductions); |
if (is_rest) { |
if (!impl()->IsIdentifier(right) && !IsValidPattern(right)) { |
classifier->RecordArrowFormalParametersError( |
@@ -1904,8 +1917,8 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePropertyName( |
ExpressionT expression = |
ParseAssignmentExpression(true, &computed_name_classifier, CHECK_OK); |
impl()->RewriteNonPattern(&computed_name_classifier, CHECK_OK); |
- classifier->Accumulate(&computed_name_classifier, |
- ExpressionClassifier::ExpressionProductions); |
+ classifier->AccumulateFormalParameterContainmentErrors( |
+ &computed_name_classifier); |
Expect(Token::RBRACK, CHECK_OK); |
return expression; |
} |
@@ -2019,8 +2032,7 @@ ParserBase<Impl>::ParsePropertyDefinition( |
true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
impl()->RewriteNonPattern(&rhs_classifier, |
CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
- classifier->Accumulate(&rhs_classifier, |
- ExpressionClassifier::ExpressionProductions); |
+ classifier->AccumulateFormalParameterContainmentErrors(&rhs_classifier); |
value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, |
kNoSourcePosition); |
classifier->RecordObjectLiteralError( |
@@ -2387,29 +2399,25 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, |
// (including those for binding patterns, since formal parameters can |
// themselves contain binding patterns). |
// Do not merge pending non-pattern expressions yet! |
- unsigned productions = |
- ExpressionClassifier::FormalParametersProductions | |
- ExpressionClassifier::AsyncArrowFormalParametersProduction | |
- ExpressionClassifier::FormalParameterInitializerProduction; |
+ unsigned productions = ExpressionClassifier::AllProductions & |
+ ~ExpressionClassifier::ArrowFormalParametersProduction; |
// Parenthesized identifiers and property references are allowed as part |
- // of a larger binding pattern, even though parenthesized patterns |
+ // of a larger assignment pattern, even though parenthesized patterns |
// themselves are not allowed, e.g., "[(x)] = []". Only accumulate |
// assignment pattern errors if the parsed expression is more complex. |
if (IsValidReferenceExpression(expression)) { |
- productions |= ExpressionClassifier::PatternProductions & |
- ~ExpressionClassifier::AssignmentPatternProduction; |
- } else { |
- productions |= ExpressionClassifier::PatternProductions; |
+ productions &= ~ExpressionClassifier::AssignmentPatternProduction; |
} |
const bool is_destructuring_assignment = |
IsValidPattern(expression) && peek() == Token::ASSIGN; |
- if (!is_destructuring_assignment) { |
- // This may be an expression or a pattern, so we must continue to |
- // accumulate expression-related errors. |
- productions |= ExpressionClassifier::ExpressionProductions | |
- ExpressionClassifier::ObjectLiteralProduction; |
+ if (is_destructuring_assignment) { |
+ // This is definitely not an expression so don't accumulate |
+ // expression-related errors. |
+ productions &= ~(ExpressionClassifier::ExpressionProduction | |
+ ExpressionClassifier::ObjectLiteralProduction | |
+ ExpressionClassifier::TailCallExpressionProduction); |
} |
classifier->Accumulate(&arrow_formals_classifier, productions, false); |
@@ -2450,11 +2458,7 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, |
ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK); |
CheckNoTailCallExpressions(&rhs_classifier, CHECK_OK); |
impl()->RewriteNonPattern(&rhs_classifier, CHECK_OK); |
- classifier->Accumulate( |
- &rhs_classifier, |
- ExpressionClassifier::ExpressionProductions | |
- ExpressionClassifier::ObjectLiteralProduction | |
- ExpressionClassifier::AsyncArrowFormalParametersProduction); |
+ classifier->AccumulateFormalParameterContainmentErrors(&rhs_classifier); |
// TODO(1231235): We try to estimate the set of properties set by |
// constructors. We define a new property whenever there is an |
@@ -2889,8 +2893,8 @@ ParserBase<Impl>::ParseLeftHandSideExpression(ExpressionClassifier* classifier, |
// async () => ... |
return factory()->NewEmptyParentheses(pos); |
} else { |
- classifier->Accumulate(&async_classifier, |
- ExpressionClassifier::AllProductions); |
+ classifier->AccumulateFormalParameterContainmentErrors( |
+ &async_classifier); |
} |
} else { |
args = ParseArguments(&spread_pos, false, classifier, CHECK_OK); |