Chromium Code Reviews| Index: src/parsing/parser-base.h |
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
| index 09061dfb062db23e3fb1bc389abef49dcd08673d..f701db75420c154c751b00082690b60a5c585db3 100644 |
| --- a/src/parsing/parser-base.h |
| +++ b/src/parsing/parser-base.h |
| @@ -82,6 +82,7 @@ class ParserBase : public Traits { |
| // Shorten type names defined by Traits. |
| typedef typename Traits::Type::Expression ExpressionT; |
| typedef typename Traits::Type::Identifier IdentifierT; |
| + typedef typename Traits::Type::IdentifierList IdentifierListT; |
| typedef typename Traits::Type::FormalParameter FormalParameterT; |
| typedef typename Traits::Type::FormalParameters FormalParametersT; |
| typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; |
| @@ -842,6 +843,7 @@ class ParserBase : public Traits { |
| typename TypeSystem::Type ParsePrimaryTypeOrParameterList(bool* ok); |
| typename TypeSystem::TypeParameters ParseTypeParameters(bool* ok); |
| typename TypeSystem::TypeArguments ParseTypeArguments(bool* ok); |
| + IdentifierListT ParsePropertyNameList(bool* ok); |
| typename TypeSystem::Type ValidateType(typename TypeSystem::Type type, |
| Scanner::Location location, bool* ok) { |
| @@ -3288,7 +3290,6 @@ ParserBase<Traits>::ParsePrimaryTypeOrParameterList(bool* ok) { |
| type = factory()->NewPredefinedType( |
| typesystem::PredefinedType::kSymbolType, pos); |
| } else { |
| - // TODO(nikolaos): Missing typeof. |
| IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
| typename TypeSystem::TypeArguments type_arguments = |
| this->NullTypeArguments(); |
| @@ -3299,6 +3300,16 @@ ParserBase<Traits>::ParsePrimaryTypeOrParameterList(bool* ok) { |
| } |
| break; |
| } |
| + case Token::TYPEOF: { |
| + Consume(Token::TYPEOF); |
| + IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
| + IdentifierListT property_names = this->NullIdentifierList(); |
| + if (peek() == Token::PERIOD) { // Braces required here. |
| + property_names = ParsePropertyNameList(CHECK_OK_TYPE); |
| + } |
| + type = factory()->NewQueryType(name, property_names, pos); |
| + break; |
| + } |
| case Token::VOID: { |
| Consume(Token::VOID); |
| type = factory()->NewPredefinedType(typesystem::PredefinedType::kVoidType, |
| @@ -3338,6 +3349,20 @@ ParserBase<Traits>::ParsePrimaryTypeOrParameterList(bool* ok) { |
| } |
| +template <typename Traits> |
| +typename ParserBase<Traits>::IdentifierListT |
|
rossberg
2016/03/17 12:34:09
Doesn't make much sense to allow identifier lists
rossberg
2016/03/17 12:37:17
Ah sorry, I was confused. Disregard that comment.
|
| +ParserBase<Traits>::ParsePropertyNameList(bool* ok) { |
| + Expect(Token::PERIOD, CHECK_OK_CUSTOM(NullIdentifierList)); |
| + IdentifierListT property_names = this->EmptyIdentifierList(); |
| + do { |
| + IdentifierT property_name = |
| + ParseIdentifierName(CHECK_OK_CUSTOM(NullIdentifierList)); |
| + property_names->Add(property_name, zone()); |
| + } while (Check(Token::PERIOD)); |
| + return property_names; |
| +} |
| + |
| + |
| #undef CHECK_OK |
| #undef CHECK_OK_CUSTOM |
| #undef CHECK_OK_TYPE |