diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 69f6042ee9c..95dddc83deb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1806,7 +1806,18 @@ public class ExpressionCodegen extends JetVisitor 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( diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java index 7d47abee921..2dc46115b2d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/TaskPrioritizer.java @@ -106,8 +106,22 @@ public class TaskPrioritizer { private boolean isSynthesized(ResolutionCandidate 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; } }; diff --git a/compiler/testData/codegen/boxWithJava/samAdapters/cantCallInherited.java b/compiler/testData/codegen/boxWithJava/samAdapters/cantCallInherited.java new file mode 100644 index 00000000000..a920bc36748 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/samAdapters/cantCallInherited.java @@ -0,0 +1,8 @@ +class Super { + void safeInvoke(Runnable r) { + if (r != null) r.run(); + } +} + +class Sub extends Super { +} diff --git a/compiler/testData/codegen/boxWithJava/samAdapters/cantCallInherited.kt b/compiler/testData/codegen/boxWithJava/samAdapters/cantCallInherited.kt new file mode 100644 index 00000000000..7cb86b41692 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/samAdapters/cantCallInherited.kt @@ -0,0 +1,7 @@ +fun box(): String { + var r = "FAIL" + val sub = Sub() + sub.safeInvoke(null) + sub.safeInvoke { r = "OK" } + return r +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index f556090d50f..92d64318f91 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -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");