| Index: src/parsing/parser-base.h
|
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
|
| index 89d760f22d3e3c1946b1cb8db50c987059b6b20f..678a4be8ab68ff2ce4b40809620fc207215d25a4 100644
|
| --- a/src/parsing/parser-base.h
|
| +++ b/src/parsing/parser-base.h
|
| @@ -858,8 +858,10 @@ class ParserBase : public Traits {
|
| typename TypeSystem::TypeParameters ParseTypeParameters(bool* ok);
|
| typename TypeSystem::TypeList ParseTypeArguments(bool* ok);
|
| IdentifierListT ParsePropertyNameList(bool* ok);
|
| + typename TypeSystem::Type ParseObjectType(bool* ok);
|
| typename TypeSystem::TypeMember ParseTypeMember(bool* ok);
|
| StatementT ParseTypeAliasDeclaration(int pos, bool* ok);
|
| + StatementT ParseInterfaceDeclaration(int pos, bool* ok);
|
|
|
| typename TypeSystem::Type ValidateType(typename TypeSystem::Type type,
|
| Scanner::Location location, bool* ok) {
|
| @@ -3498,23 +3500,7 @@ ParserBase<Traits>::ParsePrimaryTypeOrParameterList(bool* ok) {
|
| break;
|
| }
|
| case Token::LBRACE: {
|
| - Consume(Token::LBRACE);
|
| - typename TypeSystem::TypeMembers members = this->EmptyTypeMembers();
|
| - bool valid_type = true, valid_binder = true;
|
| - while (peek() != Token::RBRACE) {
|
| - typename TypeSystem::TypeMember type_member =
|
| - ParseTypeMember(CHECK_OK_TYPE);
|
| - members->Add(type_member, zone());
|
| - if (!type_member->IsValidType()) valid_type = false;
|
| - if (!type_member->IsValidBindingIdentifierOrPattern())
|
| - valid_binder = false;
|
| - if (peek() != Token::RBRACE && !Check(Token::COMMA)) {
|
| - ExpectSemicolon(CHECK_OK_TYPE);
|
| - valid_binder = false; // Semicolons not allowed in valid binders.
|
| - }
|
| - }
|
| - Consume(Token::RBRACE);
|
| - type = factory()->NewObjectType(members, valid_type, valid_binder, pos);
|
| + type = ParseObjectType(CHECK_OK_TYPE);
|
| break;
|
| }
|
| case Token::TYPEOF: {
|
| @@ -3592,6 +3578,29 @@ ParserBase<Traits>::ParsePropertyNameList(bool* ok) {
|
|
|
|
|
| template <typename Traits>
|
| +typename ParserBase<Traits>::TypeSystem::Type
|
| +ParserBase<Traits>::ParseObjectType(bool* ok) {
|
| + int pos = peek_position();
|
| + Expect(Token::LBRACE, CHECK_OK_TYPE);
|
| + typename TypeSystem::TypeMembers members = this->EmptyTypeMembers();
|
| + bool valid_type = true, valid_binder = true;
|
| + while (peek() != Token::RBRACE) {
|
| + typename TypeSystem::TypeMember type_member =
|
| + ParseTypeMember(CHECK_OK_TYPE);
|
| + members->Add(type_member, zone());
|
| + if (!type_member->IsValidType()) valid_type = false;
|
| + if (!type_member->IsValidBindingIdentifierOrPattern()) valid_binder = false;
|
| + if (peek() != Token::RBRACE && !Check(Token::COMMA)) {
|
| + ExpectSemicolon(CHECK_OK_TYPE);
|
| + valid_binder = false; // Semicolons not allowed in valid binders.
|
| + }
|
| + }
|
| + Consume(Token::RBRACE);
|
| + return factory()->NewObjectType(members, valid_type, valid_binder, pos);
|
| +}
|
| +
|
| +
|
| +template <typename Traits>
|
| typename ParserBase<Traits>::TypeSystem::TypeMember
|
| ParserBase<Traits>::ParseTypeMember(bool* ok) {
|
| int pos = peek_position();
|
| @@ -3703,6 +3712,49 @@ ParserBase<Traits>::ParseTypeAliasDeclaration(int pos, bool* ok) {
|
| }
|
|
|
|
|
| +template <typename Traits>
|
| +typename ParserBase<Traits>::StatementT
|
| +ParserBase<Traits>::ParseInterfaceDeclaration(int pos, bool* ok) {
|
| + // InterfaceDeclaration ::
|
| + // 'interface' BindingIdentifier [ TypeParameters ]
|
| + // [ InterfaceExtendsClause ] ObjectType ';'
|
| + // InterfaceExtendsClause ::
|
| + // 'extends' (TypeReference // ',')+
|
| + typename ParserBase<Traits>::StatementT empty =
|
| + factory()->NewEmptyStatement(pos);
|
| + IdentifierT name = ParseIdentifierName(ok);
|
| + if (!*ok) return empty;
|
| + // Parse optional type parameters.
|
| + typename TypeSystem::TypeParameters type_parameters =
|
| + this->NullTypeParameters();
|
| + if (peek() == Token::LT) {
|
| + type_parameters = ParseTypeParameters(ok);
|
| + if (!*ok) return empty;
|
| + }
|
| + // Parse optional extends clause.
|
| + typename TypeSystem::TypeList extends = this->NullTypeList();
|
| + if (Check(Token::EXTENDS)) {
|
| + extends = this->EmptyTypeList();
|
| + do {
|
| + typename TypeSystem::Type class_or_interface = ParseTypeReference(ok);
|
| + if (!*ok) return empty;
|
| + extends->Add(class_or_interface, zone());
|
| + } while (Check(Token::COMMA));
|
| + }
|
| + // Parse object type.
|
| + Scanner::Location type_location = scanner()->peek_location();
|
| + typename TypeSystem::Type type = ParseObjectType(ok);
|
| + if (!*ok) return empty;
|
| + type = ValidateType(type, type_location, ok);
|
| + if (!*ok) return empty;
|
| + USE(name); // TODO(nikolaos): really use them!
|
| + USE(type_parameters);
|
| + USE(extends);
|
| + USE(type);
|
| + return empty;
|
| +}
|
| +
|
| +
|
| #undef CHECK_OK
|
| #undef CHECK_OK_CUSTOM
|
| #undef CHECK_OK_TYPE
|
|
|