| Index: src/parsing/parser-base.h
|
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
|
| index f701db75420c154c751b00082690b60a5c585db3..66138b70d63d54b94f226c4af55f8d9c83d91048 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,46 @@ 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 {
|
| + if (Check(Token::COMMA)) {
|
| + typename TypeSystem::Type type_element = this->HoleTypeElement();
|
| + elements->Add(type_element, zone());
|
| + valid_type = false;
|
| + trailing_comma = true;
|
| + continue;
|
| + } else {
|
| + trailing_comma = false;
|
| + }
|
| + 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 +3361,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());
|
|
|