Index: src/ast/ast.h |
diff --git a/src/ast/ast.h b/src/ast/ast.h |
index 28710d102284e49340f53227e503d2b80c32e6ae..121a349d0b8efc27131925936bccb2749c38fd5f 100644 |
--- a/src/ast/ast.h |
+++ b/src/ast/ast.h |
@@ -107,7 +107,8 @@ namespace internal { |
V(IntersectionType) \ |
V(ArrayType) \ |
V(TupleType) \ |
- V(FunctionType) \ |
+ V(ObjectType) \ |
+ V(TypeMember) \ |
V(TypeParameter) \ |
V(FormalParameter) \ |
V(TypeReference) \ |
@@ -3136,34 +3137,6 @@ class FormalParameter : public AstNode { |
}; |
-// Class for function and constructor types. |
-class FunctionType : public Type { |
- public: |
- DECLARE_NODE_TYPE(FunctionType) |
- |
- bool IsConstructorType() const { return constructor_; } |
- ZoneList<TypeParameter*>* type_parameters() const { return type_parameters_; } |
- ZoneList<FormalParameter*>* parameters() const { return parameters_; } |
- Type* result_type() const { return result_type_; } |
- |
- protected: |
- FunctionType(Zone* zone, ZoneList<TypeParameter*>* type_parameters, |
- ZoneList<FormalParameter*>* parameters, Type* result_type, |
- int pos, bool constructor = false) |
- : Type(zone, pos), |
- type_parameters_(type_parameters), |
- parameters_(parameters), |
- result_type_(result_type), |
- constructor_(constructor) {} |
- |
- private: |
- ZoneList<TypeParameter*>* type_parameters_; |
- ZoneList<FormalParameter*>* parameters_; |
- Type* result_type_; |
- bool constructor_; |
-}; |
- |
- |
// Class for type references. |
// It also covers binding identifiers. |
class TypeReference : public Type { |
@@ -3240,18 +3213,110 @@ class TypeOrParameters : public Type { |
}; |
+// Class for object type members. |
+// It also covers binding properties. |
+class TypeMember : public AstNode { |
+ public: |
+ DECLARE_NODE_TYPE(TypeMember) |
+ |
+ enum IndexType { |
+ kNoIndexType, |
+ kNumberIndexType, |
+ kStringIndexType |
+ }; |
+ |
+ Expression* property() const { return property_; } |
+ IndexType index_type() const { return index_type_; } |
+ bool optional() const { return optional_; } |
rossberg
2016/04/07 15:09:02
Nit: is_optional, is_constructor?
nickie
2016/04/08 09:50:57
Done.
|
+ bool constructor() const { return constructor_; } |
+ ZoneList<TypeParameter*>* type_parameters() const { return type_parameters_; } |
+ ZoneList<FormalParameter*>* parameters() const { return parameters_; } |
+ Type* type() const { return type_; } |
+ bool IsValidType() const { return valid_type_; } |
+ bool IsValidBindingIdentifierOrPattern() const { return valid_binder_; } |
+ |
+ protected: |
+ TypeMember(Zone* zone, Expression* property, bool optional, |
+ ZoneList<typesystem::TypeParameter*>* type_parameters, |
+ ZoneList<typesystem::FormalParameter*>* parameters, |
+ typesystem::Type* type, bool valid_type, bool valid_binder, |
+ int pos, bool constructor = false) |
+ : AstNode(pos), |
+ property_(property), |
+ index_type_(kNoIndexType), |
+ optional_(optional), |
+ constructor_(constructor), |
+ valid_type_(valid_type), |
+ valid_binder_(valid_binder), |
+ type_parameters_(type_parameters), |
+ parameters_(parameters), |
+ type_(type) {} |
+ TypeMember(Zone* zone, Expression* property, |
+ typesystem::TypeMember::IndexType index_type, |
+ typesystem::Type* type, int pos) |
+ : AstNode(pos), |
+ property_(property), |
+ index_type_(index_type), |
+ optional_(false), |
+ constructor_(false), |
+ valid_type_(true), |
+ valid_binder_(false), |
+ type_parameters_(nullptr), |
+ parameters_(nullptr), |
+ type_(type) {} |
+ |
+ private: |
+ Expression* property_; |
+ IndexType index_type_; |
+ bool optional_; |
+ bool constructor_; |
+ bool valid_type_; |
+ bool valid_binder_; |
+ ZoneList<typesystem::TypeParameter*>* type_parameters_; |
+ ZoneList<typesystem::FormalParameter*>* parameters_; |
+ typesystem::Type* type_; |
+}; |
+ |
+ |
+// Class for object types. |
+// It also covers binding object patterns. |
+class ObjectType : public Type { |
+ public: |
+ DECLARE_NODE_TYPE(ObjectType) |
+ |
+ ZoneList<TypeMember*>* members() const { return members_; } |
+ bool IsValidType() const { return valid_type_; } |
+ bool IsValidBindingPattern() const { return valid_binder_; } |
+ |
+ protected: |
+ ObjectType(Zone* zone, ZoneList<TypeMember*>* members, bool valid_type, |
+ bool valid_binder, int pos) |
+ : Type(zone, pos), |
+ members_(members), |
+ valid_type_(valid_type), |
+ valid_binder_(valid_binder) {} |
+ |
+ private: |
+ ZoneList<TypeMember*>* members_; |
+ bool valid_type_; |
+ bool valid_binder_; |
+}; |
+ |
+ |
V8_INLINE bool Type::IsValidType() const { |
if (IsTypeOrParameters()) { |
ZoneList<FormalParameter*>* parameters = AsTypeOrParameters()->parameters(); |
return parameters->length() == 1 && parameters->at(0)->IsValidType(); |
} |
if (IsTupleType()) return AsTupleType()->IsValidType(); |
+ if (IsObjectType()) return AsObjectType()->IsValidType(); |
return true; |
} |
V8_INLINE bool Type::IsValidBindingIdentifierOrPattern() const { |
if (IsTypeReference()) return AsTypeReference()->IsValidBindingIdentifier(); |
if (IsTupleType()) return AsTupleType()->IsValidBindingPattern(); |
+ if (IsObjectType()) return AsObjectType()->IsValidBindingPattern(); |
if (IsPredefinedType()) return AsPredefinedType()->IsValidBindingIdentifier(); |
return false; |
} |
@@ -3263,6 +3328,8 @@ V8_INLINE Type* Type::Uncover(bool* ok) { |
return parameters->at(0)->type(); |
} else if (IsTupleType()) { |
if (AsTupleType()->IsValidType()) return this; |
+ } else if (IsObjectType()) { |
+ if (AsObjectType()->IsValidType()) return this; |
} else { |
return this; |
} |
@@ -3864,13 +3931,24 @@ class AstNodeFactory final BASE_EMBEDDED { |
local_zone_, elements, valid_type, valid_binder, spread, pos); |
} |
- typesystem::FunctionType* NewFunctionType( |
+ typesystem::ObjectType* NewObjectType( |
+ ZoneList<typesystem::TypeMember*>* members, bool valid_type, |
+ bool valid_binder, int pos) { |
+ return new (local_zone_) typesystem::ObjectType( |
+ local_zone_, members, valid_type, valid_binder, pos); |
+ } |
+ |
+ typesystem::ObjectType* NewFunctionType( |
ZoneList<typesystem::TypeParameter*>* type_parameters, |
ZoneList<typesystem::FormalParameter*>* parameters, |
typesystem::Type* result_type, int pos, bool constructor = false) { |
+ ZoneList<typesystem::TypeMember*>* members = |
+ new (local_zone_) ZoneList<typesystem::TypeMember*>(1, local_zone_); |
+ members->Add(NewTypeMember(nullptr, false, type_parameters, parameters, |
+ result_type, true, false, pos, constructor), |
+ local_zone_); |
return new (local_zone_) |
- typesystem::FunctionType(local_zone_, type_parameters, parameters, |
- result_type, pos, constructor); |
+ typesystem::ObjectType(local_zone_, members, true, false, pos); |
} |
typesystem::TypeReference* NewTypeReference( |
@@ -3920,6 +3998,24 @@ class AstNodeFactory final BASE_EMBEDDED { |
typesystem::TypeParameter(local_zone_, name, extends, pos); |
} |
+ typesystem::TypeMember* NewTypeMember( |
+ Expression* property, bool optional, |
+ ZoneList<typesystem::TypeParameter*>* type_parameters, |
+ ZoneList<typesystem::FormalParameter*>* parameters, |
+ typesystem::Type* type, bool valid_type, bool valid_binder, int pos, |
+ bool constructor = false) { |
+ return new (local_zone_) typesystem::TypeMember( |
+ local_zone_, property, optional, type_parameters, parameters, type, |
+ valid_type, valid_binder, pos, constructor); |
+ } |
+ |
+ typesystem::TypeMember* NewTypeMember( |
+ Expression* property, typesystem::TypeMember::IndexType index_type, |
+ typesystem::Type* type, int pos) { |
+ return new (local_zone_) |
+ typesystem::TypeMember(local_zone_, property, index_type, type, pos); |
+ } |
+ |
Zone* zone() const { return local_zone_; } |
// Handles use of temporary zones when parsing inner function bodies. |