diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 4415e37c552..f389927986b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.codegen.signature.BothSignatureWriter; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.JvmAbi; @@ -164,6 +165,21 @@ public class ClosureCodegen extends ParentCodegenAware { FunctionCodegen fc = new FunctionCodegen(context, cv, state, getParentCodegen()); fc.generateMethod(OtherOrigin(fun, funDescriptor), jvmMethodSignature, funDescriptor, strategy); + //TODO: rewrite cause ugly hack + if (samType != null) { + SimpleFunctionDescriptorImpl descriptorForBridges = SimpleFunctionDescriptorImpl + .create(funDescriptor.getContainingDeclaration(), funDescriptor.getAnnotations(), erasedInterfaceFunction.getName(), + CallableMemberDescriptor.Kind.DECLARATION, funDescriptor.getSource()); + + descriptorForBridges + .initialize(null, erasedInterfaceFunction.getDispatchReceiverParameter(), erasedInterfaceFunction.getTypeParameters(), + erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(), Modality.OPEN, + erasedInterfaceFunction.getVisibility()); + + descriptorForBridges.addOverriddenDescriptor(erasedInterfaceFunction); + fc.generateBridges(descriptorForBridges); + } + this.constructor = generateConstructor(cv, superClassAsmType); if (isConst(closure)) { diff --git a/compiler/testData/codegen/boxAgainstJava/sam/adapters/kt5912.java b/compiler/testData/codegen/boxAgainstJava/sam/adapters/kt5912.java new file mode 100644 index 00000000000..b2c3de5ffdb --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/adapters/kt5912.java @@ -0,0 +1,16 @@ +public class kt5912 { + public static interface Action { + void call(T t); + } + + public static class Some { + public Some(T t) { + } + } + + public static interface OnSubscribe extends Action> {} + + void perform(T t, OnSubscribe subscribe) { + subscribe.call(new Some(t)); + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxAgainstJava/sam/adapters/kt5912.kt b/compiler/testData/codegen/boxAgainstJava/sam/adapters/kt5912.kt new file mode 100644 index 00000000000..5eef0a5da9d --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/adapters/kt5912.kt @@ -0,0 +1,5 @@ +fun box(): String { + var s = "Failt" + kt5912().perform("") { s = "OK" } + return s +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index 0a75c2f9f62..b829c845ae7 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -410,6 +410,12 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod doTestAgainstJava(fileName); } + @TestMetadata("kt5912.kt") + public void testKt5912() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/adapters/kt5912.kt"); + doTestAgainstJava(fileName); + } + @TestMetadata("nonLiteralAndLiteralRunnable.kt") public void testNonLiteralAndLiteralRunnable() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/adapters/nonLiteralAndLiteralRunnable.kt");