Chromium Code Reviews| Index: src/parsing/parser-base.h |
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
| index f701db75420c154c751b00082690b60a5c585db3..14e7583ac5002386617f059879aa30b7c9c32cbe 100644 |
| --- a/src/parsing/parser-base.h |
| +++ b/src/parsing/parser-base.h |
| @@ -842,7 +842,7 @@ class ParserBase : public Traits { |
| typename TypeSystem::Type ParseIntersectionOrPrimaryType(bool* ok); |
| typename TypeSystem::Type ParsePrimaryTypeOrParameterList(bool* ok); |
| typename TypeSystem::TypeParameters ParseTypeParameters(bool* ok); |
| - typename TypeSystem::TypeArguments ParseTypeArguments(bool* ok); |
| + typename TypeSystem::TypeList ParseTypeArguments(bool* ok); |
| IdentifierListT ParsePropertyNameList(bool* ok); |
| typename TypeSystem::Type ValidateType(typename TypeSystem::Type type, |
| @@ -3162,16 +3162,16 @@ ParserBase<Traits>::ParseTypeParameters(bool* ok) { |
| template <typename Traits> |
| -typename ParserBase<Traits>::TypeSystem::TypeArguments |
| +typename ParserBase<Traits>::TypeSystem::TypeList |
| ParserBase<Traits>::ParseTypeArguments(bool* ok) { |
| - Expect(Token::LT, CHECK_OK_CUSTOM(NullTypeArguments)); |
| - typename TypeSystem::TypeArguments arguments = this->EmptyTypeArguments(); |
| + Expect(Token::LT, CHECK_OK_CUSTOM(NullTypeList)); |
| + typename TypeSystem::TypeList arguments = this->EmptyTypeList(); |
| do { |
| typename TypeSystem::Type type = |
| - ParseValidType(CHECK_OK_CUSTOM(NullTypeArguments)); |
| + ParseValidType(CHECK_OK_CUSTOM(NullTypeList)); |
| arguments->Add(type, zone()); |
| } while (Check(Token::COMMA)); |
| - Expect(Token::GT, CHECK_OK_CUSTOM(NullTypeArguments)); |
| + Expect(Token::GT, CHECK_OK_CUSTOM(NullTypeList)); |
| return arguments; |
| } |
| @@ -3231,34 +3231,34 @@ ParserBase<Traits>::ParsePrimaryTypeOrParameterList(bool* ok) { |
| do { |
| Scanner::Location parameter_location = scanner()->peek_location(); |
| if (Check(Token::ELLIPSIS)) { |
| + int name_pos = peek_position(); |
| IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
| if (Check(Token::COLON)) { // Braces required here. |
| type = ParseValidType(CHECK_OK_TYPE); |
| } else { |
| type = this->EmptyType(); |
| } |
| - parameters->Add( |
| - factory()->NewFormalParameter(name, false, true, type, |
| - parameter_location.beg_pos), |
| - zone()); |
| + parameters->Add(factory()->NewFormalParameter( |
| + factory()->NewTypeReference( |
| + name, this->NullTypeList(), name_pos), |
| + false, true, type, parameter_location.beg_pos), |
| + zone()); |
| break; |
| } |
| type = ParseType(CHECK_OK_TYPE); |
| if (peek() == Token::CONDITIONAL || peek() == Token::COLON) { |
| - if (!type->IsSimpleIdentifier()) { |
| + if (!type->IsValidBindingIdentifierOrPattern()) { |
| ReportUnexpectedToken(Next()); |
| *ok = false; |
| return this->EmptyType(); |
| } |
| bool optional = Check(Token::CONDITIONAL); |
| - IdentifierT name = type->AsSimpleIdentifier(); |
| + typename TypeSystem::Type of_type = this->EmptyType(); |
| if (Check(Token::COLON)) { // Braces required here. |
| type = ParseValidTypeOrStringLiteral(CHECK_OK_TYPE); |
| - } else { |
| - type = this->EmptyType(); |
| } |
| parameters->Add( |
| - factory()->NewFormalParameter(name, optional, false, type, |
| + factory()->NewFormalParameter(type, optional, false, of_type, |
| parameter_location.beg_pos), |
| zone()); |
| } else { |
| @@ -3291,8 +3291,7 @@ ParserBase<Traits>::ParsePrimaryTypeOrParameterList(bool* ok) { |
| typesystem::PredefinedType::kSymbolType, pos); |
| } else { |
| IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
| - typename TypeSystem::TypeArguments type_arguments = |
| - this->NullTypeArguments(); |
| + typename TypeSystem::TypeList type_arguments = this->NullTypeList(); |
| if (peek() == Token::LT) { // Braces required here. |
| type_arguments = ParseTypeArguments(CHECK_OK_TYPE); |
| } |
| @@ -3300,6 +3299,45 @@ ParserBase<Traits>::ParsePrimaryTypeOrParameterList(bool* ok) { |
| } |
| break; |
| } |
| + case Token::LBRACK: { |
| + Consume(Token::LBRACK); |
| + typename TypeSystem::TypeList elements = this->EmptyTypeList(); |
| + bool valid_type = false, valid_binder = true, spread = false; |
| + bool trailing_comma = false; |
| + if (peek() != Token::RBRACK) { |
| + valid_type = true; |
| + do { |
| + trailing_comma = false; |
|
rossberg
2016/03/17 16:51:37
Nit: you could make that into an else-branch for t
nickie
2016/03/18 11:12:01
Done.
|
| + if (Check(Token::COMMA)) { |
| + typename TypeSystem::Type type_element = this->HoleTypeElement(); |
| + elements->Add(type_element, zone()); |
| + valid_type = false; |
| + trailing_comma = true; |
| + continue; |
| + } |
| + if (Check(Token::ELLIPSIS)) { |
| + typename TypeSystem::Type type_element = ParseType(CHECK_OK_TYPE); |
| + elements->Add(type_element, zone()); |
| + valid_type = false; |
| + spread = true; |
| + break; |
| + } |
| + typename TypeSystem::Type type_element = ParseType(CHECK_OK_TYPE); |
| + elements->Add(type_element, zone()); |
| + if (!type_element->IsValidType()) valid_type = false; |
| + if (!type_element->IsValidBindingIdentifierOrPattern()) |
| + valid_binder = false; |
| + if (peek() != Token::RBRACK) { // Braces required here. |
| + Expect(Token::COMMA, CHECK_OK_TYPE); |
| + trailing_comma = true; |
| + } |
| + } while (peek() != Token::RBRACK); |
| + } |
| + Consume(Token::RBRACK); |
| + type = factory()->NewTupleType(elements, valid_type && !trailing_comma, |
| + valid_binder, spread, pos); |
| + break; |
| + } |
| case Token::TYPEOF: { |
| Consume(Token::TYPEOF); |
| IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
| @@ -3322,7 +3360,6 @@ ParserBase<Traits>::ParsePrimaryTypeOrParameterList(bool* ok) { |
| break; |
| } |
| // TODO(nikolaos): Missing object types. |
| - // TODO(nikolaos): Missing tuple types. |
| case Token::STRING: { |
| Consume(Token::STRING); |
| IdentifierT str = this->GetSymbol(scanner()); |