| 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 12dc109b3899a1f3e0b39faea30edc6b0cee47a2..2d0056da1546aa35f81720f2707363b9076514f7 100644
|
| --- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
|
| +++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
|
| @@ -28,6 +28,7 @@ import '../js_backend/interceptor_data.dart';
|
| import '../js_backend/native_data.dart';
|
| import '../js_backend/no_such_method_registry.dart';
|
| import '../js_backend/runtime_types.dart';
|
| +import '../js_model/closure.dart';
|
| import '../js_model/elements.dart';
|
| import '../native/enqueue.dart';
|
| import '../native/native.dart' as native;
|
| @@ -656,6 +657,28 @@ abstract class ElementCreatorMixin {
|
| });
|
| }
|
|
|
| + void addClosureClass(KernelClosureClass cls, InterfaceType supertype) {
|
| + cls.classIndex = _classEnvs.length;
|
| + _classEnvs.add(new ClassEnv.closureClass());
|
| + _classList.add(cls);
|
| +
|
| + // Create a classData and set up the interfaces and subclass
|
| + // relationships that _ensureSupertypes and _ensureThisAndRawType are doing
|
| + var closureData = new ClassData(null);
|
| + closureData
|
| + ..isMixinApplication = false
|
| + ..thisType =
|
| + closureData.rawType = new InterfaceType(cls, const/*<DartType>*/ [])
|
| + ..supertype = supertype
|
| + ..interfaces = const <InterfaceType>[];
|
| + var setBuilder =
|
| + new _KernelOrderedTypeSetBuilder((this as KernelToElementMapBase), cls);
|
| + _classData.add(closureData);
|
| + closureData.orderedTypeSet = setBuilder.createOrderedTypeSet(
|
| + closureData.supertype, const Link<InterfaceType>());
|
| + // TODO(efortuna): Does getMetadata get called in ClassData for this object?
|
| + }
|
| +
|
| ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) {
|
| return _classMap.putIfAbsent(node, () {
|
| KLibrary library = _getLibrary(node.enclosingLibrary);
|
| @@ -664,7 +687,7 @@ abstract class ElementCreatorMixin {
|
| }
|
| _classEnvs.add(classEnv);
|
| _classData.add(new ClassData(node));
|
| - ClassEntity cls = createClass(library, _classMap.length, node.name,
|
| + ClassEntity cls = createClass(library, _classList.length, node.name,
|
| isAbstract: node.isAbstract);
|
| _classList.add(cls);
|
| return cls;
|
| @@ -1536,7 +1559,7 @@ abstract class KernelClosedWorldMixin implements ClosedWorldBase {
|
|
|
| @override
|
| ClassEntity getSuperClass(ClassEntity cls) {
|
| - throw new UnimplementedError('KernelClosedWorldMixin.getSuperClass');
|
| + return elementMap._getSuperType(cls)?.element;
|
| }
|
|
|
| @override
|
| @@ -1606,8 +1629,32 @@ class KernelClosedWorld extends ClosedWorldBase
|
| }
|
|
|
| @override
|
| - void registerClosureClass(ClassElement cls) {
|
| - throw new UnimplementedError('KernelClosedWorld.registerClosureClass');
|
| + void registerClosureClass(ClassEntity cls, bool fromInstanceMember) {
|
| + // Tell the hierarchy that this is the super class. then we can use
|
| + // .getSupertypes(class)
|
| + IndexedClass superclass = fromInstanceMember
|
| + ? commonElements.boundClosureClass
|
| + : commonElements.closureClass;
|
| + ClassHierarchyNode parentNode = getClassHierarchyNode(superclass);
|
| + ClassHierarchyNode node = new ClassHierarchyNode(
|
| + parentNode, cls, getHierarchyDepth(superclass) + 1);
|
| + addClassHierarchyNode(cls, node);
|
| + for (InterfaceType type in getOrderedTypeSet(superclass).types) {
|
| + // TODO(efortuna): assert that the FunctionClass is in this ordered set.
|
| + // If not, we need to explicitly add node as a subtype of FunctionClass.
|
| + ClassSet subtypeSet = getClassSet(type.element);
|
| + subtypeSet.addSubtype(node);
|
| + }
|
| + addClassSet(cls, new ClassSet(node));
|
| +
|
| + // Ensure that the supertype's hierarchy is completely set up.
|
| + var supertype = new InterfaceType(superclass, const []);
|
| + ClassData superdata = elementMap._classData[superclass.classIndex];
|
| + elementMap._ensureSupertypes(superclass, superdata);
|
| + elementMap._ensureThisAndRawType(superclass, superdata);
|
| +
|
| + elementMap.addClosureClass(cls, supertype);
|
| + node.isDirectlyInstantiated = true;
|
| }
|
| }
|
|
|
|
|