Index: runtime/vm/ast.h |
=================================================================== |
--- runtime/vm/ast.h (revision 45315) |
+++ runtime/vm/ast.h (working copy) |
@@ -1286,6 +1286,7 @@ |
const Field& field() const { return field_; } |
void set_is_deferred(bool value) { is_deferred_reference_ = value; } |
+ bool is_deferred_reference() const { return is_deferred_reference_; } |
virtual void VisitChildren(AstNodeVisitor* visitor) const { } |
@@ -1550,6 +1551,7 @@ |
const String& field_name) |
: AstNode(token_pos), |
receiver_(receiver), |
+ owner_(Object::ZoneHandle(cls.raw())), |
cls_(cls), |
field_name_(field_name), |
is_deferred_reference_(false) { |
@@ -1561,6 +1563,17 @@ |
// The receiver is required for a super getter (an instance method that |
// is resolved at compile time rather than at runtime). |
AstNode* receiver() const { return receiver_; } |
+ |
+ // The getter node needs to remmeber how the getter was referenced |
+ // so that it can resolve a corresponding setter if necessary. |
+ // The owner of this getter is either a class, the top-level library scope, |
+ // or a prefix (if the getter has been referenced throug a library prefix). |
+ void set_owner(const Object& value) { |
+ ASSERT(value.IsLibraryPrefix() || value.IsLibrary() || value.IsClass()); |
+ owner_ = value.raw(); |
+ } |
+ const Object& owner() const { return owner_; } |
+ |
const Class& cls() const { return cls_; } |
const String& field_name() const { return field_name_; } |
bool is_super_getter() const { return receiver_ != NULL; } |
@@ -1577,6 +1590,7 @@ |
private: |
AstNode* receiver_; |
+ Object& owner_; |
const Class& cls_; |
const String& field_name_; |
bool is_deferred_reference_; |
@@ -1587,16 +1601,36 @@ |
class StaticSetterNode : public AstNode { |
public: |
+ // Static setter with resolved setter function. |
StaticSetterNode(intptr_t token_pos, |
AstNode* receiver, |
- const Class& cls, |
const String& field_name, |
+ const Function& function, |
AstNode* value) |
: AstNode(token_pos), |
receiver_(receiver), |
- cls_(cls), |
+ cls_(Class::ZoneHandle(function.Owner())), |
field_name_(field_name), |
+ function_(function), |
value_(value) { |
+ ASSERT(function_.IsZoneHandle()); |
+ ASSERT(function.is_static() || receiver != NULL); |
+ ASSERT(field_name_.IsZoneHandle()); |
+ ASSERT(value_ != NULL); |
+ } |
+ |
+ // For unresolved setters. |
+ StaticSetterNode(intptr_t token_pos, |
+ AstNode* receiver, |
+ const Class& cls, |
+ const String& field_name, |
+ AstNode* value) |
+ : AstNode(token_pos), |
+ receiver_(receiver), |
+ cls_(cls), |
+ field_name_(field_name), |
+ function_(Function::ZoneHandle()), |
+ value_(value) { |
ASSERT(cls_.IsZoneHandle()); |
ASSERT(field_name_.IsZoneHandle()); |
ASSERT(value_ != NULL); |
@@ -1607,6 +1641,8 @@ |
AstNode* receiver() const { return receiver_; } |
const Class& cls() const { return cls_; } |
const String& field_name() const { return field_name_; } |
+ // function() returns null for unresolved setters. |
+ const Function& function() const { return function_; } |
AstNode* value() const { return value_; } |
virtual void VisitChildren(AstNodeVisitor* visitor) const { |
@@ -1619,6 +1655,7 @@ |
AstNode* receiver_; |
const Class& cls_; |
const String& field_name_; |
+ const Function& function_; |
AstNode* value_; |
DISALLOW_IMPLICIT_CONSTRUCTORS(StaticSetterNode); |