Index: pkg/compiler/lib/src/kernel/element_map.dart |
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart |
index dc7f0f64ddc86ca6051c9976ce1689f050998124..db9fae41092e53e9a00e5f25f550af46318b4d9e 100644 |
--- a/pkg/compiler/lib/src/kernel/element_map.dart |
+++ b/pkg/compiler/lib/src/kernel/element_map.dart |
@@ -164,11 +164,11 @@ abstract class KernelToElementMapForBuilding implements KernelToElementMap { |
/// Returns the list of [DartType]s corresponding to [types]. |
List<DartType> getDartTypes(List<ir.DartType> types); |
- /// Returns the kernel IR node that defines the [member]. |
- ir.Node getMemberNode(covariant MemberEntity member); |
+ /// Returns the definition information for [member]. |
+ MemberDefinition getMemberDefinition(covariant MemberEntity member); |
- /// Returns the kernel IR node that defines the [cls]. |
- ir.Class getClassNode(covariant ClassEntity cls); |
+ /// Returns the definition information for [cls]. |
+ ClassDefinition getClassDefinition(covariant ClassEntity cls); |
/// Returns the [LibraryEntity] corresponding to the library [node]. |
LibraryEntity getLibrary(ir.Library node); |
@@ -198,6 +198,104 @@ abstract class KernelToElementMapForBuilding implements KernelToElementMap { |
String getDeferredUri(ir.LibraryDependency node); |
} |
+// TODO(johnniwinther,efortuna): Add more when needed. |
+// TODO(johnniwinther): Should we split regular into method, field, etc.? |
+enum MemberKind { |
+ // A regular member defined by an [ir.Node]. |
+ regular, |
+ // A constructor whose initializer is defined by an [ir.Constructor] node. |
+ constructor, |
+ // A constructor whose body is defined by an [ir.Constructor] node. |
+ constructorBody, |
+ // A closure class `call` method whose body is defined by an |
+ // [ir.FunctionExpression]. |
+ closureCall, |
+} |
+ |
+/// Definition information for a [MemberEntity]. |
+abstract class MemberDefinition { |
+ /// The defined member. |
+ MemberEntity get member; |
+ |
+ /// The kind of the defined member. This determines the semantics of [node]. |
+ MemberKind get kind; |
+ |
+ /// The defining [ir.Node] for this member, if supported by its [kind]. |
+ /// |
+ /// For a regular class this is the [ir.Class] node. For closure classes this |
+ /// might be an [ir.FunctionExpression] node if needed. |
+ ir.Node get node; |
+ |
+ /// The canonical location of [member]. This is used for sorting the members |
+ /// in the emitted code. |
+ ir.Location get location; |
+} |
+ |
+enum ClassKind { |
+ regular, |
+ closure, |
+} |
+ |
+/// A member directly defined by its [ir.Member] node. |
+class RegularMemberDefinition implements MemberDefinition { |
+ final MemberEntity member; |
+ final ir.Member node; |
+ |
+ RegularMemberDefinition(this.member, this.node); |
+ |
+ ir.Location get location => node.location; |
+ |
+ MemberKind get kind => MemberKind.regular; |
+ |
+ String toString() => 'RegularMemberDefinition(kind:$kind,member:$member,' |
+ 'node:$node,location:$location)'; |
+} |
+ |
+/// The definition of a special kind of member |
+class SpecialMemberDefinition implements MemberDefinition { |
+ final MemberEntity member; |
+ final ir.TreeNode node; |
+ final MemberKind kind; |
+ |
+ SpecialMemberDefinition(this.member, this.node, this.kind); |
+ |
+ ir.Location get location => node.location; |
+ |
+ String toString() => 'SpecialMemberDefinition(kind:$kind,member:$member,' |
+ 'node:$node,location:$location)'; |
+} |
+ |
+/// Definition information for a [ClassEntity]. |
+abstract class ClassDefinition { |
+ /// The defined class. |
+ ClassEntity get cls; |
+ |
+ /// The kind of the defined class. This determines the semantics of [node]. |
+ ClassKind get kind; |
+ |
+ /// The defining [ir.Node] for this class, if supported by its [kind]. |
+ ir.Node get node; |
+ |
+ /// The canonical location of [cls]. This is used for sorting the classes |
+ /// in the emitted code. |
+ ir.Location get location; |
+} |
+ |
+/// A class directly defined by its [ir.Class] node. |
+class RegularClassDefinition implements ClassDefinition { |
+ final ClassEntity cls; |
+ final ir.Class node; |
+ |
+ RegularClassDefinition(this.cls, this.node); |
+ |
+ ir.Location get location => node.location; |
+ |
+ ClassKind get kind => ClassKind.regular; |
+ |
+ String toString() => 'RegularClassDefinition(kind:$kind,cls:$cls,' |
+ 'node:$node,location:$location)'; |
+} |
+ |
/// Kinds of foreign functions. |
enum ForeignKind { |
JS, |