Index: pkg/compiler/lib/src/kernel/element_map_impl.dart |
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
index d53af0c39545bb72400800fb56b41c42b758088e..538da1dd560eac15cbd6153dcc39d59f5b65c1c7 100644 |
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart |
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
@@ -477,6 +477,12 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
}); |
} |
+ void _forEachConstructorBody( |
+ IndexedClass cls, void f(ConstructorBodyEntity member)) { |
+ throw new UnsupportedError( |
+ 'KernelToElementMapBase._forEachConstructorBody'); |
+ } |
+ |
void _forEachClassMember( |
IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) { |
assert(checkFamily(cls)); |
@@ -659,8 +665,8 @@ abstract class ElementCreatorMixin { |
ConstructorEntity _getConstructor(ir.Member node) { |
return _constructorMap.putIfAbsent(node, () { |
int memberIndex = _memberData.length; |
- KConstructor constructor; |
- KClass enclosingClass = _getClass(node.enclosingClass); |
+ ConstructorEntity constructor; |
+ ClassEntity enclosingClass = _getClass(node.enclosingClass); |
Name name = getName(node.name); |
bool isExternal = node.isExternal; |
@@ -1153,6 +1159,12 @@ class KernelElementEnvironment implements ElementEnvironment { |
} |
@override |
+ void forEachConstructorBody( |
+ ClassEntity cls, void f(ConstructorBodyEntity constructor)) { |
+ elementMap._forEachConstructorBody(cls, f); |
+ } |
+ |
+ @override |
void forEachLibraryMember( |
LibraryEntity library, void f(MemberEntity member)) { |
elementMap._forEachLibraryMember(library, f); |
@@ -1817,6 +1829,26 @@ class JsKernelToElementMap extends KernelToElementMapBase |
return constructor; |
} |
+ FunctionEntity getConstructorBody(ir.Constructor node) { |
+ ConstructorEntity constructor = getConstructor(node); |
+ return _getConstructorBody(node, constructor); |
+ } |
+ |
+ FunctionEntity _getConstructorBody( |
+ ir.Constructor node, covariant IndexedConstructor constructor) { |
+ ConstructorData data = _memberData[constructor.memberIndex]; |
+ if (data.constructorBody == null) { |
+ data.constructorBody = |
+ createConstructorBody(_memberList.length, constructor); |
+ _memberList.add(data.constructorBody); |
+ _memberData.add(new FunctionData(node, node.function)); |
+ } |
+ return data.constructorBody; |
+ } |
+ |
+ ConstructorBodyEntity createConstructorBody( |
+ int memberIndex, ConstructorEntity constructor); |
+ |
@override |
ir.Member getMemberNode(MemberEntity member) { |
return _getMemberNode(member); |
@@ -1852,4 +1884,24 @@ class JsKernelToElementMap extends KernelToElementMapBase |
FunctionData data = _memberData[function.memberIndex]; |
data.forEachParameter(this, f); |
} |
+ |
+ void _forEachConstructorBody( |
+ IndexedClass cls, void f(ConstructorBodyEntity member)) { |
+ ClassEnv env = _classEnvs[cls.classIndex]; |
+ env.forEachConstructor((ir.Member member) { |
+ IndexedConstructor constructor = _constructorMap[member]; |
+ if (constructor == null) { |
+ // The constructor is not live. |
+ return; |
+ } |
+ ConstructorData data = _memberData[constructor.memberIndex]; |
+ if (data.constructorBody != null) { |
+ f(data.constructorBody); |
+ } |
+ }); |
+ } |
+ |
+ String getDeferredUri(ir.LibraryDependency node) { |
+ throw new UnimplementedError('JsKernelToElementMap.getDeferredUri'); |
+ } |
} |