Handle super* in ir/impact.dart

Change-Id: I91a5f76f45e1f3d5248b31322e107a5dc00d69af
Reviewed-on: https://dart-review.googlesource.com/c/89150
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index d9be817..570fa82 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -257,7 +257,9 @@
   }
 
   void registerCatch();
+
   void registerStackTrace();
+
   void registerCatchType(ir.DartType type);
 
   @override
@@ -497,4 +499,36 @@
       ir.DartType receiverType, ir.DartType valueType) {
     registerInstanceSet(receiverType, ClassRelation.exact, node.target);
   }
+
+  void registerSuperInvocation(ir.Name name, ir.Arguments arguments);
+
+  @override
+  void handleSuperMethodInvocation(ir.SuperMethodInvocation node,
+      ArgumentTypes argumentTypes, ir.DartType returnType) {
+    registerSuperInvocation(node.name, node.arguments);
+  }
+
+  void registerSuperGet(ir.Name name);
+
+  @override
+  void handleSuperPropertyGet(
+      ir.SuperPropertyGet node, ir.DartType resultType) {
+    registerSuperGet(node.name);
+  }
+
+  void registerSuperSet(ir.Name name);
+
+  @override
+  void handleSuperPropertySet(ir.SuperPropertySet node, ir.DartType valueType) {
+    registerSuperSet(node.name);
+  }
+
+  void registerSuperInitializer(
+      ir.Constructor source, ir.Constructor target, ir.Arguments arguments);
+
+  @override
+  void handleSuperInitializer(
+      ir.SuperInitializer node, ArgumentTypes argumentTypes) {
+    registerSuperInitializer(node.parent, node.target, node.arguments);
+  }
 }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 14ad0e0..9a8c1d1 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -414,6 +414,9 @@
     if (superClass == targetClass) {
       return target;
     }
+
+    /// This path is needed for synthetically injected superclasses like
+    /// `Interceptor` and `JavaScriptObject`.
     KClassEnv env = classes.getEnv(superClass);
     ConstructorEntity constructor = env.lookupConstructor(this, target.name);
     if (constructor != null) {
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index e8f6ee9..c3b4306 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -241,16 +241,16 @@
   }
 
   @override
-  Null handleSuperInitializer(
-      ir.SuperInitializer node, ArgumentTypes argumentTypes) {
+  void registerSuperInitializer(
+      ir.Constructor source, ir.Constructor target, ir.Arguments arguments) {
     // TODO(johnniwinther): Maybe rewrite `node.target` to point to a
     // synthesized unnamed mixin constructor when needed. This would require us
     // to consider impact building a required pre-step for inference and
     // ssa-building.
-    ConstructorEntity target =
-        elementMap.getSuperConstructor(node.parent, node.target);
+    ConstructorEntity constructor =
+        elementMap.getSuperConstructor(source, target);
     impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
-        target, elementMap.getCallStructure(node.arguments)));
+        constructor, elementMap.getCallStructure(arguments)));
   }
 
   @override
@@ -345,7 +345,8 @@
         elementMap.getMember(member), elementMap.getImport(import)));
   }
 
-  void handleSuperInvocation(ir.Name name, ir.Node arguments) {
+  @override
+  void registerSuperInvocation(ir.Name name, ir.Arguments arguments) {
     FunctionEntity method =
         elementMap.getSuperMember(currentMember, name, setter: false);
     List<DartType> typeArguments = _getTypeArguments(arguments);
@@ -361,14 +362,7 @@
   }
 
   @override
-  void handleSuperMethodInvocation(ir.SuperMethodInvocation node,
-      ArgumentTypes argumentTypes, ir.DartType returnType) {
-    // TODO(johnniwinther): Should we support this or always use the
-    // [MixinFullResolution] transformer?
-    handleSuperInvocation(node.name, node.arguments);
-  }
-
-  void handleSuperGet(ir.Name name, ir.Member target) {
+  void registerSuperGet(ir.Name name) {
     MemberEntity member =
         elementMap.getSuperMember(currentMember, name, setter: false);
     if (member != null) {
@@ -386,12 +380,7 @@
   }
 
   @override
-  void handleSuperPropertyGet(
-      ir.SuperPropertyGet node, ir.DartType resultType) {
-    handleSuperGet(node.name, node.interfaceTarget);
-  }
-
-  void handleSuperSet(ir.Name name, ir.Node target, ir.Node value) {
+  void registerSuperSet(ir.Name name) {
     MemberEntity member =
         elementMap.getSuperMember(currentMember, name, setter: true);
     if (member != null) {
@@ -409,11 +398,6 @@
   }
 
   @override
-  void handleSuperPropertySet(ir.SuperPropertySet node, ir.DartType valueType) {
-    handleSuperSet(node.name, node.interfaceTarget, node.value);
-  }
-
-  @override
   void registerLocalFunctionInvocation(
       ir.FunctionDeclaration localFunction, ir.Arguments arguments) {
     CallStructure callStructure = elementMap.getCallStructure(arguments);