Fixed calling inherited SAM adapter.

This commit is contained in:
Evgeny Gerashchenko
2013-04-30 17:19:50 +04:00
parent fed5cf6524
commit 516a5b76e8
5 changed files with 48 additions and 3 deletions
@@ -1806,7 +1806,18 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return null;
}
SimpleFunctionDescriptor original = ((SimpleFunctionDescriptor) fun).getOriginal();
return bindingContext.get(SAM_ADAPTER_FUNCTION_TO_ORIGINAL, original);
if (original.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) {
return bindingContext.get(SAM_ADAPTER_FUNCTION_TO_ORIGINAL, original);
}
if (original.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
for (FunctionDescriptor overridden : original.getOverriddenDescriptors()) {
SimpleFunctionDescriptor originalIfSamAdapter = getOriginalIfSamAdapter(overridden);
if (originalIfSamAdapter != null) {
return originalIfSamAdapter;
}
}
}
return null;
}
private StackValue invokeSamConstructor(
@@ -106,8 +106,22 @@ public class TaskPrioritizer {
private boolean isSynthesized(ResolutionCandidate<D> call) {
D descriptor = call.getDescriptor();
return descriptor instanceof CallableMemberDescriptor &&
((CallableMemberDescriptor) descriptor).getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED;
return descriptor instanceof CallableMemberDescriptor && isOrOverridesSynthesized((CallableMemberDescriptor) descriptor);
}
private boolean isOrOverridesSynthesized(CallableMemberDescriptor descriptor) {
if (descriptor.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) {
return true;
}
if (descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
for (CallableMemberDescriptor overridden : descriptor.getOverriddenDescriptors()) {
if (!isOrOverridesSynthesized(overridden)) {
return false;
}
}
return true;
}
return false;
}
};
@@ -0,0 +1,8 @@
class Super {
void safeInvoke(Runnable r) {
if (r != null) r.run();
}
}
class Sub extends Super {
}
@@ -0,0 +1,7 @@
fun box(): String {
var r = "FAIL"
val sub = Sub()
sub.safeInvoke(null)
sub.safeInvoke { r = "OK" }
return r
}
@@ -135,6 +135,11 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/boxWithJava/samAdapters"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("cantCallInherited.kt")
public void testCantCallInherited() throws Exception {
doTestWithJava("compiler/testData/codegen/boxWithJava/samAdapters/cantCallInherited.kt");
}
@TestMetadata("comparator.kt")
public void testComparator() throws Exception {
doTestWithJava("compiler/testData/codegen/boxWithJava/samAdapters/comparator.kt");