diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index feb52803e97..3cc14ad907f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1891,17 +1891,17 @@ public class ExpressionCodegen extends JetVisitor implem } @Nullable - private SimpleFunctionDescriptor getOriginalIfSamAdapter(@NotNull CallableDescriptor fun) { - if (!(fun instanceof SimpleFunctionDescriptor)) { + private FunctionDescriptor getOriginalIfSamAdapter(@NotNull CallableDescriptor fun) { + if (!(fun instanceof FunctionDescriptor)) { return null; } - SimpleFunctionDescriptor original = ((SimpleFunctionDescriptor) fun).getOriginal(); + FunctionDescriptor original = ((FunctionDescriptor) fun).getOriginal(); if (original.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) { - return (SimpleFunctionDescriptor) bindingContext.get(SAM_ADAPTER_FUNCTION_TO_ORIGINAL, original); // TODO support constructor + 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); + FunctionDescriptor originalIfSamAdapter = getOriginalIfSamAdapter(overridden); if (originalIfSamAdapter != null) { return originalIfSamAdapter; } @@ -2059,7 +2059,7 @@ public class ExpressionCodegen extends JetVisitor implem return typeMapper.mapToFunctionInvokeCallableMethod(createInvoke(fd)); } else { - SimpleFunctionDescriptor originalOfSamAdapter = getOriginalIfSamAdapter(fd); + SimpleFunctionDescriptor originalOfSamAdapter = (SimpleFunctionDescriptor) getOriginalIfSamAdapter(fd); return typeMapper.mapToCallableMethod(originalOfSamAdapter != null ? originalOfSamAdapter : fd, superCall, isCallInsideSameClassAsDeclared(fd, context), isCallInsideSameModuleAsDeclared(fd, context), @@ -2293,7 +2293,7 @@ public class ExpressionCodegen extends JetVisitor implem int mask = 0; - SimpleFunctionDescriptor originalOfSamAdapter = getOriginalIfSamAdapter(fd); + FunctionDescriptor originalOfSamAdapter = getOriginalIfSamAdapter(fd); for (ValueParameterDescriptor valueParameter : fd.getValueParameters()) { ResolvedValueArgument resolvedValueArgument = valueArguments.get(valueParameter.getIndex()); @@ -3263,7 +3263,8 @@ public class ExpressionCodegen extends JetVisitor implem //See StackValue.receiver for more info pushClosureOnStack(closure, resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists()); - CallableMethod method = typeMapper.mapToCallableMethod(constructorDescriptor); + ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) getOriginalIfSamAdapter(constructorDescriptor); + CallableMethod method = typeMapper.mapToCallableMethod(originalOfSamAdapter == null ? constructorDescriptor : originalOfSamAdapter); invokeMethodWithArguments(method, resolvedCall, null, StackValue.none()); return StackValue.onStack(type); diff --git a/compiler/testData/codegen/boxWithJava/samAdapters/constructor.java b/compiler/testData/codegen/boxWithJava/samAdapters/constructor.java new file mode 100644 index 00000000000..c47e8ab052e --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/samAdapters/constructor.java @@ -0,0 +1,11 @@ +class JavaClass { + private Runnable r; + + public JavaClass(Runnable r) { + this.r = r; + } + + public void run() { + r.run(); + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/samAdapters/constructor.kt b/compiler/testData/codegen/boxWithJava/samAdapters/constructor.kt new file mode 100644 index 00000000000..15128cc1a13 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/samAdapters/constructor.kt @@ -0,0 +1,5 @@ +fun box(): String { + var v = "FAIL" + JavaClass { v = "OK" }.run() + return v +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index 92d64318f91..803f18aef84 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -145,6 +145,11 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege doTestWithJava("compiler/testData/codegen/boxWithJava/samAdapters/comparator.kt"); } + @TestMetadata("constructor.kt") + public void testConstructor() throws Exception { + doTestWithJava("compiler/testData/codegen/boxWithJava/samAdapters/constructor.kt"); + } + @TestMetadata("fileFilter.kt") public void testFileFilter() throws Exception { doTestWithJava("compiler/testData/codegen/boxWithJava/samAdapters/fileFilter.kt");