Index: pkg/compiler/lib/src/ssa/kernel_impact.dart |
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart |
index 22b055312868c760264cd19857a4428214e7d727..de794a45e69829088c7af774f79a8663cf0a76ac 100644 |
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart |
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart |
@@ -64,8 +64,7 @@ ir.Member getIrMember(Compiler compiler, ResolvedAst resolvedAst) { |
ResolutionImpact buildKernelImpact( |
ir.Member member, KernelToElementMap elementAdapter) { |
- KernelImpactBuilder builder = |
- new KernelImpactBuilder('${member.name}', elementAdapter); |
+ KernelImpactBuilder builder = new KernelImpactBuilder(elementAdapter, member); |
if (member is ir.Procedure) { |
return builder.buildProcedure(member); |
} else if (member is ir.Constructor) { |
@@ -79,9 +78,11 @@ ResolutionImpact buildKernelImpact( |
class KernelImpactBuilder extends ir.Visitor { |
final ResolutionWorldImpactBuilder impactBuilder; |
final KernelToElementMap elementAdapter; |
+ final ir.Member currentMember; |
- KernelImpactBuilder(String name, this.elementAdapter) |
- : this.impactBuilder = new ResolutionWorldImpactBuilder(name); |
+ KernelImpactBuilder(this.elementAdapter, this.currentMember) |
+ : this.impactBuilder = |
+ new ResolutionWorldImpactBuilder('${currentMember.name}'); |
CommonElements get commonElements => elementAdapter.commonElements; |
@@ -389,8 +390,9 @@ class KernelImpactBuilder extends ir.Visitor { |
impactBuilder.registerStaticUse(new StaticUse.staticSet(member)); |
} |
- void handleSuperInvocation(ir.Node target, ir.Node arguments) { |
- FunctionEntity method = elementAdapter.getMethod(target); |
+ void handleSuperInvocation(ir.Name name, ir.Node target, ir.Node arguments) { |
+ FunctionEntity method = elementAdapter |
+ .getSuperMember(currentMember, name, target, setter: false); |
_visitArguments(arguments); |
impactBuilder.registerStaticUse(new StaticUse.superInvoke( |
method, elementAdapter.getCallStructure(arguments))); |
@@ -398,55 +400,55 @@ class KernelImpactBuilder extends ir.Visitor { |
@override |
void visitDirectMethodInvocation(ir.DirectMethodInvocation node) { |
- handleSuperInvocation(node.target, node.arguments); |
+ handleSuperInvocation(node.name, node.target, node.arguments); |
} |
@override |
void visitSuperMethodInvocation(ir.SuperMethodInvocation node) { |
// TODO(johnniwinther): Should we support this or always use the |
// [MixinFullResolution] transformer? |
- handleSuperInvocation(node.interfaceTarget, node.arguments); |
+ handleSuperInvocation(node.name, node.interfaceTarget, node.arguments); |
} |
- void handleSuperGet(ir.Member target) { |
- if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { |
- FunctionEntity method = elementAdapter.getMethod(target); |
- impactBuilder.registerStaticUse(new StaticUse.superTearOff(method)); |
+ void handleSuperGet(ir.Name name, ir.Member target) { |
+ MemberEntity member = elementAdapter |
+ .getSuperMember(currentMember, name, target, setter: false); |
+ if (member.isFunction) { |
+ impactBuilder.registerStaticUse(new StaticUse.superTearOff(member)); |
} else { |
- MemberEntity member = elementAdapter.getMember(target); |
impactBuilder.registerStaticUse(new StaticUse.superGet(member)); |
} |
} |
@override |
void visitDirectPropertyGet(ir.DirectPropertyGet node) { |
- handleSuperGet(node.target); |
+ handleSuperGet(null, node.target); |
} |
@override |
void visitSuperPropertyGet(ir.SuperPropertyGet node) { |
- handleSuperGet(node.interfaceTarget); |
+ handleSuperGet(node.name, node.interfaceTarget); |
} |
- void handleSuperSet(ir.Node target, ir.Node value) { |
+ void handleSuperSet(ir.Name name, ir.Node target, ir.Node value) { |
visitNode(value); |
- if (target is ir.Field) { |
- FieldEntity field = elementAdapter.getField(target); |
- impactBuilder.registerStaticUse(new StaticUse.superFieldSet(field)); |
+ MemberEntity member = elementAdapter |
+ .getSuperMember(currentMember, name, target, setter: true); |
+ if (member.isField) { |
+ impactBuilder.registerStaticUse(new StaticUse.superFieldSet(member)); |
} else { |
- FunctionEntity method = elementAdapter.getMethod(target); |
- impactBuilder.registerStaticUse(new StaticUse.superSetterSet(method)); |
+ impactBuilder.registerStaticUse(new StaticUse.superSetterSet(member)); |
} |
} |
@override |
void visitDirectPropertySet(ir.DirectPropertySet node) { |
- handleSuperSet(node.target, node.value); |
+ handleSuperSet(null, node.target, node.value); |
} |
@override |
void visitSuperPropertySet(ir.SuperPropertySet node) { |
- handleSuperSet(node.interfaceTarget, node.value); |
+ handleSuperSet(node.name, node.interfaceTarget, node.value); |
} |
@override |