Index: src/preparser.h |
diff --git a/src/preparser.h b/src/preparser.h |
index 9f2b13212c6526f7d130502e0d08a315177671fb..a5aa3709a6d509174fe9c02530b80cd940c907ab 100644 |
--- a/src/preparser.h |
+++ b/src/preparser.h |
@@ -2611,19 +2611,66 @@ ParserBase<Traits>::ParsePropertyDefinition( |
this->PushLiteralName(fni_, name); |
} |
- if (!in_class && !is_generator && peek() == Token::COLON) { |
- // PropertyDefinition : PropertyName ':' AssignmentExpression |
- if (!*is_computed_name) { |
- checker->CheckProperty(name_token, kValueProperty, is_static, |
- is_generator, |
- CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
+ if (!in_class && !is_generator) { |
+ DCHECK(!is_static); |
+ |
+ if (peek() == Token::COLON) { |
+ // PropertyDefinition |
+ // PropertyName ':' AssignmentExpression |
+ if (!*is_computed_name) { |
+ checker->CheckProperty(name_token, kValueProperty, false, false, |
+ CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
+ } |
+ Consume(Token::COLON); |
+ value = this->ParseAssignmentExpression( |
+ true, classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
+ return factory()->NewObjectLiteralProperty(name_expression, value, false, |
+ *is_computed_name); |
} |
- Consume(Token::COLON); |
- value = this->ParseAssignmentExpression( |
- true, classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
- } else if (is_generator || peek() == Token::LPAREN) { |
- // Concise Method |
+ if (Token::IsIdentifier(name_token, language_mode(), |
+ this->is_generator()) && |
+ (peek() == Token::COMMA || peek() == Token::RBRACE || |
+ peek() == Token::ASSIGN)) { |
+ // PropertyDefinition |
+ // IdentifierReference |
+ // CoverInitializedName |
+ // |
+ // CoverInitializedName |
+ // IdentifierReference Initializer? |
+ if (classifier->duplicate_finder() != nullptr && |
+ scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) { |
+ classifier->RecordDuplicateFormalParameterError(scanner()->location()); |
+ } |
+ |
+ ExpressionT lhs = this->ExpressionFromIdentifier( |
+ name, next_beg_pos, next_end_pos, scope_, factory()); |
+ |
+ if (peek() == Token::ASSIGN) { |
+ this->ExpressionUnexpectedToken(classifier); |
+ Consume(Token::ASSIGN); |
+ ExpressionClassifier rhs_classifier; |
+ ExpressionT rhs = this->ParseAssignmentExpression( |
+ true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
+ classifier->Accumulate(rhs_classifier, |
+ ExpressionClassifier::ExpressionProductions); |
+ value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, |
+ RelocInfo::kNoPosition); |
+ } else { |
+ value = lhs; |
+ } |
+ |
+ return factory()->NewObjectLiteralProperty( |
+ name_expression, value, ObjectLiteralProperty::COMPUTED, false, |
+ false); |
+ } |
+ } |
+ |
+ |
+ if (is_generator || peek() == Token::LPAREN) { |
+ // MethodDefinition |
+ // PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}' |
+ // '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}' |
if (!*is_computed_name) { |
checker->CheckProperty(name_token, kMethodProperty, is_static, |
is_generator, |
@@ -2650,15 +2697,19 @@ ParserBase<Traits>::ParsePropertyDefinition( |
return factory()->NewObjectLiteralProperty(name_expression, value, |
ObjectLiteralProperty::COMPUTED, |
is_static, *is_computed_name); |
+ } |
- } else if (in_class && name_is_static && !is_static) { |
- // static MethodDefinition |
+ if (in_class && name_is_static && !is_static) { |
+ // ClassElement (static) |
+ // 'static' MethodDefinition |
return ParsePropertyDefinition(checker, true, has_extends, true, |
is_computed_name, nullptr, classifier, ok); |
- } else if ((is_get || is_set) && |
- (in_class || (peek() != Token::RBRACE && peek() != Token::COMMA && |
- peek() != Token::ASSIGN))) { |
- // Accessor |
+ } |
+ |
+ if (is_get || is_set) { |
+ // MethodDefinition (Accessors) |
+ // get PropertyName '(' ')' '{' FunctionBody '}' |
+ // set PropertyName '(' PropertySetParameterList ')' '{' FunctionBody '}' |
name = this->EmptyIdentifier(); |
bool dont_care = false; |
name_token = peek(); |
@@ -2693,44 +2744,12 @@ ParserBase<Traits>::ParsePropertyDefinition( |
name_expression, value, |
is_get ? ObjectLiteralProperty::GETTER : ObjectLiteralProperty::SETTER, |
is_static, *is_computed_name); |
- |
- } else if (!in_class && Token::IsIdentifier(name_token, language_mode(), |
- this->is_generator())) { |
- DCHECK(!*is_computed_name); |
- DCHECK(!is_static); |
- |
- if (classifier->duplicate_finder() != nullptr && |
- scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) { |
- classifier->RecordDuplicateFormalParameterError(scanner()->location()); |
- } |
- |
- ExpressionT lhs = this->ExpressionFromIdentifier( |
- name, next_beg_pos, next_end_pos, scope_, factory()); |
- if (peek() == Token::ASSIGN) { |
- this->ExpressionUnexpectedToken(classifier); |
- Consume(Token::ASSIGN); |
- ExpressionClassifier rhs_classifier; |
- ExpressionT rhs = this->ParseAssignmentExpression( |
- true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
- classifier->Accumulate(rhs_classifier, |
- ExpressionClassifier::ExpressionProductions); |
- value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, |
- RelocInfo::kNoPosition); |
- } else { |
- value = lhs; |
- } |
- return factory()->NewObjectLiteralProperty( |
- name_expression, value, ObjectLiteralProperty::COMPUTED, false, false); |
- |
- } else { |
- Token::Value next = Next(); |
- ReportUnexpectedToken(next); |
- *ok = false; |
- return this->EmptyObjectLiteralProperty(); |
} |
- return factory()->NewObjectLiteralProperty(name_expression, value, is_static, |
- *is_computed_name); |
+ Token::Value next = Next(); |
+ ReportUnexpectedToken(next); |
+ *ok = false; |
+ return this->EmptyObjectLiteralProperty(); |
} |