Index: runtime/vm/kernel.cc |
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc |
index 6953cea46d1e422c17a00c924b2534c468227bfc..9ba7963792eba361fca1a992fb6155c78315e323 100644 |
--- a/runtime/vm/kernel.cc |
+++ b/runtime/vm/kernel.cc |
@@ -33,162 +33,60 @@ CanonicalName* CanonicalName::NewRoot() { |
} |
-CanonicalName* CanonicalName::AddChild(String* name) { |
- CanonicalName* child = new CanonicalName(); |
- child->parent_ = this; |
- child->name_ = name; |
- children_.Add(child); |
- return child; |
-} |
- |
- |
-bool CanonicalName::IsAdministrative() { |
- // Administrative names start with '@'. |
- return (name()->size() > 0) && (name()->buffer()[0] == '@'); |
-} |
- |
- |
-bool CanonicalName::IsPrivate() { |
- // Private names start with '_'. |
- return (name()->size() > 0) && (name()->buffer()[0] == '_'); |
+void CanonicalName::BindTo(LinkedNode* new_target) { |
+ ASSERT(new_target != NULL); |
+ if (definition_ == new_target) return; |
+ ASSERT(definition_ == NULL); |
+ ASSERT(new_target->canonical_name_ == NULL); |
+ definition_ = new_target; |
+ new_target->canonical_name_ = this; |
} |
-bool CanonicalName::IsRoot() { |
- // The root is the only canonical name with no parent. |
- return parent() == NULL; |
+void CanonicalName::Unbind() { |
+ if (definition_ == NULL) return; |
+ ASSERT(definition_->canonical_name_ == this); |
+ definition_->canonical_name_ = NULL; |
+ definition_ = NULL; |
} |
-bool CanonicalName::IsLibrary() { |
- // Libraries are the only canonical names with the root as their parent. |
- return !IsRoot() && parent()->IsRoot(); |
-} |
- |
- |
-bool CanonicalName::IsClass() { |
- // Classes have the library as their parent and are not an administrative |
- // name starting with @. |
- return !IsAdministrative() && !IsRoot() && parent()->IsLibrary(); |
-} |
- |
- |
-bool CanonicalName::IsMember() { |
- return IsConstructor() || IsField() || IsProcedure(); |
-} |
- |
- |
-// Note the two occurrences of the parameter 'literal'. |
-#define COMPARE_NAME(canonical_name, literal) \ |
- memcmp((canonical_name)->name()->buffer(), (literal), strlen(literal)) == 0 |
- |
-bool CanonicalName::IsField() { |
- // Fields with private names have the import URI of the library where they are |
- // visible as the parent and the string "@fields" as the parent's parent. |
- // Fields with non-private names have the string "@fields' as the parent. |
- if (IsRoot()) { |
- return false; |
- } |
- CanonicalName* kind = this->parent(); |
- if (IsPrivate()) { |
- kind = kind->parent(); |
- } |
- return COMPARE_NAME(kind, "@fields"); |
-} |
- |
- |
-bool CanonicalName::IsConstructor() { |
- // Constructors with private names have the import URI of the library where |
- // they are visible as the parent and the string "@constructors" as the |
- // parent's parent. Constructors with non-private names have the string |
- // "@constructors" as the parent. |
- if (IsRoot()) { |
- return false; |
- } |
- CanonicalName* kind = this->parent(); |
- if (IsPrivate()) { |
- kind = kind->parent(); |
- } |
- return COMPARE_NAME(kind, "@constructors"); |
+CanonicalName* CanonicalName::AddChild(String* name) { |
+ CanonicalName* child = new CanonicalName(); |
+ child->parent_ = this; |
+ child->name_ = name; |
+ children_.Add(child); |
+ return child; |
} |
-bool CanonicalName::IsProcedure() { |
- return IsMethod() || IsGetter() || IsSetter() || IsFactory(); |
+Library* CanonicalName::AsLibrary() { |
+ return Library::Cast(definition()); |
} |
-bool CanonicalName::IsMethod() { |
- // Methods with private names have the import URI of the library where they |
- // are visible as the parent and the string "@methods" as the parent's parent. |
- // Methods with non-private names have the string "@methods" as the parent. |
- if (IsRoot()) { |
- return false; |
- } |
- CanonicalName* kind = this->parent(); |
- if (IsPrivate()) { |
- kind = kind->parent(); |
- } |
- return COMPARE_NAME(kind, "@methods"); |
+Class* CanonicalName::AsClass() { |
+ return Class::Cast(definition()); |
} |
-bool CanonicalName::IsGetter() { |
- // Getters with private names have the import URI of the library where they |
- // are visible as the parent and the string "@getters" as the parent's parent. |
- // Getters with non-private names have the string "@getters" as the parent. |
- if (IsRoot()) { |
- return false; |
- } |
- CanonicalName* kind = this->parent(); |
- if (IsPrivate()) { |
- kind = kind->parent(); |
- } |
- return COMPARE_NAME(kind, "@getters"); |
+Member* CanonicalName::AsMember() { |
+ return Member::Cast(definition()); |
} |
-bool CanonicalName::IsSetter() { |
- // Setters with private names have the import URI of the library where they |
- // are visible as the parent and the string "@setters" as the parent's parent. |
- // Setters with non-private names have the string "@setters" as the parent. |
- if (IsRoot()) { |
- return false; |
- } |
- CanonicalName* kind = this->parent(); |
- if (IsPrivate()) { |
- kind = kind->parent(); |
- } |
- return COMPARE_NAME(kind, "@setters"); |
+Field* CanonicalName::AsField() { |
+ return Field::Cast(definition()); |
} |
-bool CanonicalName::IsFactory() { |
- // Factories with private names have the import URI of the library where they |
- // are visible as the parent and the string "@factories" as the parent's |
- // parent. Factories with non-private names have the string "@factories" as |
- // the parent. |
- if (IsRoot()) { |
- return false; |
- } |
- CanonicalName* kind = this->parent(); |
- if (IsPrivate()) { |
- kind = kind->parent(); |
- } |
- return COMPARE_NAME(kind, "@factories"); |
+Constructor* CanonicalName::AsConstructor() { |
+ return Constructor::Cast(definition()); |
} |
-#undef COMPARE_NAME |
- |
-CanonicalName* CanonicalName::EnclosingName() { |
- ASSERT(IsField() || IsConstructor() || IsProcedure()); |
- CanonicalName* enclosing = parent()->parent(); |
- if (IsPrivate()) { |
- enclosing = enclosing->parent(); |
- } |
- ASSERT(enclosing->IsLibrary() || enclosing->IsClass()); |
- return enclosing; |
+Procedure* CanonicalName::AsProcedure() { |
+ return Procedure::Cast(definition()); |
} |
@@ -237,6 +135,11 @@ void NormalClass::AcceptClassVisitor(ClassVisitor* visitor) { |
} |
+void NormalClass::AcceptReferenceVisitor(ClassReferenceVisitor* visitor) { |
+ visitor->VisitNormalClassReference(this); |
+} |
+ |
+ |
void NormalClass::VisitChildren(Visitor* visitor) { |
VisitList(&type_parameters(), visitor); |
if (super_class() != NULL) visitor->VisitInterfaceType(super_class()); |
@@ -255,6 +158,11 @@ void MixinClass::AcceptClassVisitor(ClassVisitor* visitor) { |
} |
+void MixinClass::AcceptReferenceVisitor(ClassReferenceVisitor* visitor) { |
+ visitor->VisitMixinClassReference(this); |
+} |
+ |
+ |
void MixinClass::VisitChildren(Visitor* visitor) { |
VisitList(&type_parameters(), visitor); |
visitor->VisitInterfaceType(first()); |
@@ -280,6 +188,11 @@ void Field::AcceptMemberVisitor(MemberVisitor* visitor) { |
} |
+void Field::AcceptReferenceVisitor(MemberReferenceVisitor* visitor) { |
+ visitor->VisitFieldReference(this); |
+} |
+ |
+ |
void Field::VisitChildren(Visitor* visitor) { |
type()->AcceptDartTypeVisitor(visitor); |
visitor->VisitName(name()); |
@@ -295,6 +208,11 @@ void Constructor::AcceptMemberVisitor(MemberVisitor* visitor) { |
} |
+void Constructor::AcceptReferenceVisitor(MemberReferenceVisitor* visitor) { |
+ visitor->VisitConstructorReference(this); |
+} |
+ |
+ |
void Constructor::VisitChildren(Visitor* visitor) { |
visitor->VisitName(name()); |
visitor->VisitFunctionNode(function()); |
@@ -310,6 +228,11 @@ void Procedure::AcceptMemberVisitor(MemberVisitor* visitor) { |
} |
+void Procedure::AcceptReferenceVisitor(MemberReferenceVisitor* visitor) { |
+ visitor->VisitProcedureReference(this); |
+} |
+ |
+ |
void Procedure::VisitChildren(Visitor* visitor) { |
visitor->VisitName(name()); |
if (function() != NULL) visitor->VisitFunctionNode(function()); |
@@ -344,6 +267,7 @@ void FieldInitializer::AcceptInitializerVisitor(InitializerVisitor* visitor) { |
void FieldInitializer::VisitChildren(Visitor* visitor) { |
+ visitor->VisitFieldReference(field()); |
value()->AcceptExpressionVisitor(visitor); |
} |
@@ -357,6 +281,7 @@ void SuperInitializer::AcceptInitializerVisitor(InitializerVisitor* visitor) { |
void SuperInitializer::VisitChildren(Visitor* visitor) { |
+ visitor->VisitConstructorReference(target()); |
visitor->VisitArguments(arguments()); |
} |
@@ -371,6 +296,7 @@ void RedirectingInitializer::AcceptInitializerVisitor( |
void RedirectingInitializer::VisitChildren(Visitor* visitor) { |
+ visitor->VisitConstructorReference(target()); |
visitor->VisitArguments(arguments()); |
} |
@@ -487,6 +413,7 @@ void DirectPropertyGet::AcceptExpressionVisitor(ExpressionVisitor* visitor) { |
void DirectPropertyGet::VisitChildren(Visitor* visitor) { |
receiver()->AcceptExpressionVisitor(visitor); |
+ target()->AcceptReferenceVisitor(visitor); |
} |
@@ -500,6 +427,7 @@ void DirectPropertySet::AcceptExpressionVisitor(ExpressionVisitor* visitor) { |
void DirectPropertySet::VisitChildren(Visitor* visitor) { |
receiver()->AcceptExpressionVisitor(visitor); |
+ target()->AcceptReferenceVisitor(visitor); |
value()->AcceptExpressionVisitor(visitor); |
} |
@@ -512,7 +440,9 @@ void StaticGet::AcceptExpressionVisitor(ExpressionVisitor* visitor) { |
} |
-void StaticGet::VisitChildren(Visitor* visitor) {} |
+void StaticGet::VisitChildren(Visitor* visitor) { |
+ target()->AcceptReferenceVisitor(visitor); |
+} |
StaticSet::~StaticSet() {} |
@@ -524,6 +454,7 @@ void StaticSet::AcceptExpressionVisitor(ExpressionVisitor* visitor) { |
void StaticSet::VisitChildren(Visitor* visitor) { |
+ target()->AcceptReferenceVisitor(visitor); |
expression()->AcceptExpressionVisitor(visitor); |
} |
@@ -582,6 +513,7 @@ void DirectMethodInvocation::AcceptExpressionVisitor( |
void DirectMethodInvocation::VisitChildren(Visitor* visitor) { |
receiver()->AcceptExpressionVisitor(visitor); |
+ visitor->VisitProcedureReference(target()); |
visitor->VisitArguments(arguments()); |
} |
@@ -595,6 +527,7 @@ void StaticInvocation::AcceptExpressionVisitor(ExpressionVisitor* visitor) { |
void StaticInvocation::VisitChildren(Visitor* visitor) { |
+ visitor->VisitProcedureReference(procedure()); |
visitor->VisitArguments(arguments()); |
} |
@@ -609,6 +542,7 @@ void ConstructorInvocation::AcceptExpressionVisitor( |
void ConstructorInvocation::VisitChildren(Visitor* visitor) { |
+ visitor->VisitConstructorReference(target()); |
visitor->VisitArguments(arguments()); |
} |
@@ -1260,6 +1194,7 @@ void InterfaceType::AcceptDartTypeVisitor(DartTypeVisitor* visitor) { |
void InterfaceType::VisitChildren(Visitor* visitor) { |
+ klass()->AcceptReferenceVisitor(visitor); |
VisitList(&type_arguments(), visitor); |
} |
@@ -1323,6 +1258,7 @@ void Program::AcceptTreeVisitor(TreeVisitor* visitor) { |
void Program::VisitChildren(Visitor* visitor) { |
VisitList(&libraries(), visitor); |
+ visitor->VisitProcedureReference(main_method()); |
} |