Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index f780b2966b4515c188cf4c410c40e6368943ef1f..ad4c22f3dab8741dbd95fa849297453b14057b78 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -74,8 +74,23 @@ struct FormalParametersBase { |
// typedef PropertyList; |
// typedef FormalParameter; |
// typedef FormalParameters; |
+// typedef Statement; |
+// typedef StatementList; |
// // For constructing objects returned by the traversing functions. |
// typedef Factory; |
+// // For classifying and validating expressions. |
+// typedef ExpressionClassifier. |
+// // A struct with extra types for the optional type system. |
+// struct TypeSystem { |
+// typedef Type; |
+// typedef TypeList; |
+// typedef TypeParameter; |
+// typedef TypeParameters; |
+// typedef FormalParameter; |
+// typedef FormalParameters; |
+// typedef TypeMember; |
+// typedef TypeMembers; |
+// }; |
// }; |
// // ... |
// }; |
@@ -773,7 +788,8 @@ class ParserBase : public Traits { |
ObjectLiteralPropertyT ParsePropertyDefinition( |
ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends, |
bool is_static, bool* is_computed_name, bool* has_seen_constructor, |
- ExpressionClassifier* classifier, IdentifierT* name, bool* ok); |
+ ExpressionClassifier* classifier, IdentifierT* name, bool ambient, |
+ bool* ok); |
typename Traits::Type::ExpressionList ParseArguments( |
Scanner::Location* first_spread_pos, ExpressionClassifier* classifier, |
bool* ok); |
@@ -1404,7 +1420,7 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier, |
} |
return this->ParseClassLiteral(name, class_name_location, |
is_strict_reserved_name, |
- class_token_position, ok); |
+ class_token_position, false, ok); |
} |
case Token::TEMPLATE_SPAN: |
@@ -1679,7 +1695,8 @@ typename ParserBase<Traits>::ObjectLiteralPropertyT |
ParserBase<Traits>::ParsePropertyDefinition( |
ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends, |
bool is_static, bool* is_computed_name, bool* has_seen_constructor, |
- ExpressionClassifier* classifier, IdentifierT* name, bool* ok) { |
+ ExpressionClassifier* classifier, IdentifierT* name, bool ambient, |
+ bool* ok) { |
DCHECK(!in_class || is_static || has_seen_constructor != nullptr); |
// Parse index member declarations in typed mode. |
@@ -1837,6 +1854,7 @@ ParserBase<Traits>::ParsePropertyDefinition( |
} |
// Allow signatures when in a class. |
if (in_class) type_flags |= typesystem::kAllowSignature; |
+ if (ambient) type_flags |= typesystem::kAmbient; |
value = this->ParseFunctionLiteral( |
*name, scanner()->location(), kSkipFunctionNameCheck, kind, |
@@ -1865,7 +1883,7 @@ ParserBase<Traits>::ParsePropertyDefinition( |
*name = this->EmptyIdentifier(); |
ObjectLiteralPropertyT property = ParsePropertyDefinition( |
checker, true, has_extends, true, is_computed_name, nullptr, classifier, |
- name, ok); |
+ name, ambient, ok); |
Traits::RewriteNonPattern(classifier, ok); |
return property; |
} |
@@ -1874,6 +1892,12 @@ ParserBase<Traits>::ParsePropertyDefinition( |
// MethodDefinition (Accessors) |
// get PropertyName '(' ')' '{' FunctionBody '}' |
// set PropertyName '(' PropertySetParameterList ')' '{' FunctionBody '}' |
+ if (ambient) { |
+ *ok = false; |
+ ReportMessage(MessageTemplate::kAmbientGetOrSet); |
+ return this->EmptyObjectLiteralProperty(); |
+ } |
+ |
*name = this->EmptyIdentifier(); |
bool dont_care = false; |
name_token = peek(); |
@@ -1918,7 +1942,7 @@ ParserBase<Traits>::ParsePropertyDefinition( |
} |
USE(type); // TODO(nikolaos): really use it! |
// Parse optional initializer. |
- if (Check(Token::ASSIGN)) { |
+ if (!ambient && Check(Token::ASSIGN)) { |
ExpressionClassifier rhs_classifier(this); |
ExpressionT rhs = this->ParseAssignmentExpression( |
true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
@@ -1963,7 +1987,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseObjectLiteral( |
IdentifierT name = this->EmptyIdentifier(); |
ObjectLiteralPropertyT property = this->ParsePropertyDefinition( |
&checker, in_class, has_extends, is_static, &is_computed_name, NULL, |
- classifier, &name, CHECK_OK); |
+ classifier, &name, false, CHECK_OK); |
if (is_computed_name) { |
has_computed_names = true; |