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);