Chromium Code Reviews| Index: src/parsing/parser-base.h |
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
| index 581015f5c9b88196869e988a16165481d66d3139..70c9548483154b04e02241c98735d494aad2a969 100644 |
| --- a/src/parsing/parser-base.h |
| +++ b/src/parsing/parser-base.h |
| @@ -1523,8 +1523,14 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
| first_spread_index = values->length(); |
| } |
| - CheckDestructuringElement(argument, classifier, start_pos, |
| - scanner()->location().end_pos); |
| + if (argument->IsAssignment()) { |
| + classifier->RecordPatternError( |
| + Scanner::Location(start_pos, scanner()->location().end_pos), |
| + MessageTemplate::kInvalidDestructuringTarget); |
| + } else { |
| + CheckDestructuringElement(argument, classifier, start_pos, |
| + scanner()->location().end_pos); |
| + } |
| if (peek() == Token::COMMA) { |
| classifier->RecordPatternError( |
| @@ -1534,12 +1540,6 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
| } else { |
| elem = this->ParseAssignmentExpression(true, kIsPatternElement, |
| classifier, CHECK_OK); |
| - if (!this->IsValidReferenceExpression(elem) && |
| - !classifier->is_valid_assignment_pattern()) { |
| - classifier->RecordPatternError( |
| - Scanner::Location(pos, scanner()->location().end_pos), |
| - MessageTemplate::kInvalidDestructuringTarget); |
| - } |
| } |
| values->Add(elem, zone_); |
| if (peek() != Token::RBRACK) { |
| @@ -1666,18 +1666,10 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| } |
| Consume(Token::COLON); |
| - int pos = peek_position(); |
| value = this->ParseAssignmentExpression( |
| true, kIsPatternElement, classifier, |
| CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| - if (!this->IsValidReferenceExpression(value) && |
| - !classifier->is_valid_assignment_pattern()) { |
| - classifier->RecordPatternError( |
| - Scanner::Location(pos, scanner()->location().end_pos), |
| - MessageTemplate::kInvalidDestructuringTarget); |
| - } |
| - |
| return factory()->NewObjectLiteralProperty(name_expression, value, false, |
| *is_computed_name); |
| } |
| @@ -1710,6 +1702,7 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| ExpressionT lhs = this->ExpressionFromIdentifier( |
| name, next_beg_pos, next_end_pos, scope_, factory()); |
| + CheckDestructuringElement(lhs, classifier, next_beg_pos, next_end_pos); |
| if (peek() == Token::ASSIGN) { |
| Consume(Token::ASSIGN); |
| @@ -2045,16 +2038,12 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags, |
| bool maybe_pattern = |
| expression->IsObjectLiteral() || expression->IsArrayLiteral(); |
| - // bool binding_pattern = |
| - // allow_harmony_destructuring_bind() && maybe_pattern && !is_rhs; |
| if (!Token::IsAssignmentOp(peek())) { |
| // Parsed conditional expression only (no assignment). |
| - if (is_pattern_element && !this->IsValidReferenceExpression(expression) && |
| - !maybe_pattern) { |
| - classifier->RecordPatternError( |
| - Scanner::Location(lhs_beg_pos, scanner()->location().end_pos), |
| - MessageTemplate::kInvalidDestructuringTarget); |
| + if (is_pattern_element) { |
| + CheckDestructuringElement(expression, classifier, lhs_beg_pos, |
| + scanner()->location().end_pos); |
| } else if (is_rhs && maybe_pattern) { |
| ValidateExpression(classifier, CHECK_OK); |
| } |
| @@ -2077,6 +2066,10 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags, |
| classifier, expression, lhs_beg_pos, scanner()->location().end_pos, |
| MessageTemplate::kInvalidLhsInAssignment); |
| } else { |
| + if (is_pattern_element) { |
| + CheckDestructuringElement(expression, classifier, lhs_beg_pos, |
| + scanner()->location().end_pos); |
| + } |
| expression = this->CheckAndRewriteReferenceExpression( |
| expression, lhs_beg_pos, scanner()->location().end_pos, |
| MessageTemplate::kInvalidLhsInAssignment, CHECK_OK); |
| @@ -3284,13 +3277,14 @@ void ParserBase<Traits>::CheckDestructuringElement( |
| int end) { |
| static const MessageTemplate::Template message = |
| MessageTemplate::kInvalidDestructuringTarget; |
| - if (!this->IsAssignableIdentifier(expression)) { |
| - const Scanner::Location location(begin, end); |
| + const Scanner::Location location(begin, end); |
| + if (expression->IsArrayLiteral() || expression->IsObjectLiteral() || |
| + expression->IsAssignment()) |
| + return; |
|
adamk
2015/12/16 09:45:42
Nit: wrap this in a block (required by style since
|
| + if (expression->IsProperty()) { |
| classifier->RecordBindingPatternError(location, message); |
| - if (!expression->IsProperty() && |
| - !(expression->IsObjectLiteral() || expression->IsArrayLiteral())) { |
| - classifier->RecordAssignmentPatternError(location, message); |
| - } |
| + } else if (!this->IsAssignableIdentifier(expression)) { |
| + classifier->RecordPatternError(location, message); |
| } |
| } |