Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index 22c09d54a103876ec7eb6742c1c65596f01b021f..878538c784f5674b30884340fe637f25bf655c73 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -198,7 +198,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_private_class_fields_(false) {} |
#define ALLOW_ACCESSORS(name) \ |
bool allow_##name() const { return allow_##name##_; } \ |
@@ -215,6 +216,7 @@ class ParserBase { |
ALLOW_ACCESSORS(harmony_restrictive_generators); |
ALLOW_ACCESSORS(harmony_trailing_commas); |
ALLOW_ACCESSORS(harmony_class_fields); |
+ ALLOW_ACCESSORS(harmony_private_class_fields); |
#undef ALLOW_ACCESSORS |
@@ -1105,8 +1107,8 @@ class ParserBase { |
bool* ok); |
ExpressionT ParseObjectLiteral(bool* ok); |
ClassLiteralPropertyT ParseClassPropertyDefinition( |
- ClassLiteralChecker* checker, bool has_extends, bool* is_computed_name, |
- bool* has_seen_constructor, bool* ok); |
+ ClassLiteralChecker* checker, bool has_extends, IdentifierT* private_name, |
+ bool* is_computed_name, bool* has_seen_constructor, bool* ok); |
FunctionLiteralT ParseClassFieldForInitializer(bool has_initializer, |
bool* ok); |
ObjectLiteralPropertyT ParseObjectPropertyDefinition( |
@@ -1341,6 +1343,7 @@ class ParserBase { |
bool allow_harmony_restrictive_generators_; |
bool allow_harmony_trailing_commas_; |
bool allow_harmony_class_fields_; |
+ bool allow_harmony_private_class_fields_; |
friend class DiscardableZoneScope; |
}; |
@@ -1605,6 +1608,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( |
// TemplateLiteral |
// do Block |
// AsyncFunctionExpression |
+ // PrivateName |
int beg_pos = peek_position(); |
switch (peek()) { |
@@ -1728,6 +1732,14 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( |
} |
break; |
+ case Token::HASH: |
+ if (allow_harmony_private_class_fields()) { |
+ BindingPatternUnexpectedToken(); |
+ return impl()->ParsePrivateFieldReference( |
+ impl()->ThisExpression(beg_pos), ok); |
+ } |
+ break; |
+ |
default: |
break; |
} |
@@ -2014,11 +2026,10 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePropertyName( |
template <typename Impl> |
typename ParserBase<Impl>::ClassLiteralPropertyT |
-ParserBase<Impl>::ParseClassPropertyDefinition(ClassLiteralChecker* checker, |
- bool has_extends, |
- bool* is_computed_name, |
- bool* has_seen_constructor, |
- bool* ok) { |
+ParserBase<Impl>::ParseClassPropertyDefinition( |
+ ClassLiteralChecker* checker, bool has_extends, IdentifierT* private_name, |
+ bool* is_computed_name, bool* has_seen_constructor, bool* ok) { |
+ DCHECK(!allow_harmony_private_class_fields() || private_name != nullptr); |
DCHECK(has_seen_constructor != nullptr); |
bool is_get = false; |
bool is_set = false; |
@@ -2047,6 +2058,21 @@ ParserBase<Impl>::ParseClassPropertyDefinition(ClassLiteralChecker* checker, |
&name, &kind, &is_generator, &is_get, &is_set, &is_async, |
is_computed_name, CHECK_OK_CUSTOM(EmptyClassLiteralProperty)); |
} |
+ } else if (allow_harmony_private_class_fields() && |
+ name_token == Token::HASH) { |
+ Consume(Token::HASH); |
+ // Private field |
+ *private_name = ParseIdentifierName(CHECK_OK_CUSTOM( |
+ EmptyClassLiteralProperty)); // TODO(bakkot) IdentifierPart |
+ name_expression = impl()->EmptyExpression(); |
+ |
+ bool has_initializer = Check(Token::ASSIGN); |
+ FunctionLiteralT function_literal = ParseClassFieldForInitializer( |
+ has_initializer, CHECK_OK_CUSTOM(EmptyClassLiteralProperty)); |
+ ExpectSemicolon(CHECK_OK_CUSTOM(EmptyClassLiteralProperty)); |
+ return factory()->NewClassLiteralProperty(name_expression, function_literal, |
+ ClassLiteralProperty::FIELD, |
+ false, false); |
} else { |
name_expression = ParsePropertyName( |
&name, &kind, &is_generator, &is_get, &is_set, &is_async, |
@@ -3373,6 +3399,10 @@ ParserBase<Impl>::ParseMemberExpressionContinuation(ExpressionT expression, |
ArrowFormalParametersUnexpectedToken(); |
Consume(Token::PERIOD); |
+ if (allow_harmony_private_class_fields() && peek() == Token::HASH) { |
+ expression = impl()->ParsePrivateFieldReference(expression, CHECK_OK); |
+ break; |
+ } |
int pos = position(); |
IdentifierT name = ParseIdentifierName(CHECK_OK); |
expression = factory()->NewProperty( |