Chromium Code Reviews| Index: src/parsing/parser-base.h |
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
| index c833f03239e668a8efd3a5442e680e3773359052..50717f894d7e3094076bc0b6edc4f2b1bbd13c77 100644 |
| --- a/src/parsing/parser-base.h |
| +++ b/src/parsing/parser-base.h |
| @@ -218,7 +218,8 @@ class ParserBase { |
| allow_harmony_async_await_(false), |
| allow_harmony_restrictive_generators_(false), |
| allow_harmony_trailing_commas_(false), |
| - allow_harmony_class_fields_(false) {} |
| + allow_harmony_class_fields_(false), |
| + allow_harmony_object_spread_(false) {} |
| #define ALLOW_ACCESSORS(name) \ |
| bool allow_##name() const { return allow_##name##_; } \ |
| @@ -232,6 +233,7 @@ class ParserBase { |
| ALLOW_ACCESSORS(harmony_restrictive_generators); |
| ALLOW_ACCESSORS(harmony_trailing_commas); |
| ALLOW_ACCESSORS(harmony_class_fields); |
| + ALLOW_ACCESSORS(harmony_object_spread); |
| #undef ALLOW_ACCESSORS |
| @@ -1150,6 +1152,7 @@ class ParserBase { |
| kShorthandProperty, |
| kMethodProperty, |
| kClassField, |
| + kSpreadProperty, |
| kNotSet |
| }; |
| @@ -1456,6 +1459,7 @@ class ParserBase { |
| bool allow_harmony_restrictive_generators_; |
| bool allow_harmony_trailing_commas_; |
| bool allow_harmony_class_fields_; |
| + bool allow_harmony_object_spread_; |
| friend class DiscardableZoneScope; |
| }; |
| @@ -2109,6 +2113,23 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePropertyName( |
| break; |
| } |
| + case Token::ELLIPSIS: { |
|
adamk
2017/01/05 22:39:14
No need for this block
gsathya
2017/01/05 22:56:29
Done.
|
| + if (allow_harmony_object_spread()) { |
| + // TODO(gsathya): Implement destructuring/rest |
| + classifier()->RecordPatternError(scanner()->location(), |
| + MessageTemplate::kUnexpectedToken); |
| + |
| + *name = impl()->EmptyIdentifier(); |
| + Consume(Token::ELLIPSIS); |
| + ExpressionClassifier spread_classifier(this); |
| + expression = ParseAssignmentExpression(true, CHECK_OK); |
| + impl()->RewriteNonPattern(CHECK_OK); |
| + impl()->AccumulateFormalParameterContainmentErrors(); |
| + *kind = PropertyKind::kSpreadProperty; |
| + return expression; |
| + } |
| + } |
| + |
| default: |
| *name = ParseIdentifierName(CHECK_OK); |
| break; |
| @@ -2269,6 +2290,8 @@ ParserBase<Impl>::ParseClassPropertyDefinition( |
| *property_kind, *is_static, |
| *is_computed_name); |
| } |
| + case PropertyKind::kSpreadProperty: |
| + UNREACHABLE(); |
| } |
| UNREACHABLE(); |
| return impl()->EmptyClassLiteralProperty(); |
| @@ -2330,6 +2353,18 @@ ParserBase<Impl>::ParseObjectPropertyDefinition(ObjectLiteralChecker* checker, |
| is_computed_name, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| switch (kind) { |
| + case PropertyKind::kSpreadProperty: |
| + DCHECK(allow_harmony_object_spread()); |
| + DCHECK(!is_get && !is_set && !is_generator && !is_async && |
| + !*is_computed_name); |
| + DCHECK(name_token == Token::ELLIPSIS); |
| + |
| + *is_computed_name = true; |
| + |
| + return factory()->NewObjectLiteralProperty( |
| + impl()->GetLiteralTheHole(kNoSourcePosition), name_expression, |
| + ObjectLiteralProperty::SPREAD, true); |
| + |
| case PropertyKind::kValueProperty: { |
| DCHECK(!is_get && !is_set && !is_generator && !is_async); |