diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamCodegenUtil.java index a132599786d..19c2fbbbb32 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamCodegenUtil.java @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.codegen; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; import org.jetbrains.kotlin.descriptors.FunctionDescriptor; import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor; import org.jetbrains.kotlin.synthetic.SamAdapterExtensionFunctionDescriptor; @@ -26,13 +25,12 @@ import org.jetbrains.kotlin.synthetic.SamAdapterExtensionFunctionDescriptor; public class SamCodegenUtil { @Nullable public static FunctionDescriptor getOriginalIfSamAdapter(@NotNull FunctionDescriptor fun) { - FunctionDescriptor original = fun.getOriginal(); - if (original instanceof SamAdapterDescriptor) { - return ((SamAdapterDescriptor) original).getOriginForSam(); + if (fun instanceof SamAdapterDescriptor) { + return ((SamAdapterDescriptor) fun).getOriginForSam(); } - if (original instanceof SamAdapterExtensionFunctionDescriptor) { - return ((SamAdapterExtensionFunctionDescriptor) original).getSourceFunction(); + if (fun instanceof SamAdapterExtensionFunctionDescriptor) { + return ((SamAdapterExtensionFunctionDescriptor) fun).getSourceFunction(); } return null; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java index 78fe4a8bd66..275e724b889 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java @@ -26,10 +26,10 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.cfg.WhenChecker; import org.jetbrains.kotlin.codegen.*; import org.jetbrains.kotlin.codegen.state.GenerationState; +import org.jetbrains.kotlin.codegen.state.TypeMapperUtilsKt; import org.jetbrains.kotlin.codegen.when.SwitchCodegenUtil; import org.jetbrains.kotlin.codegen.when.WhenByEnumsMapping; import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl; import org.jetbrains.kotlin.fileClasses.FileClasses; import org.jetbrains.kotlin.fileClasses.JvmFileClassesProvider; import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor; @@ -46,8 +46,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.kotlin.resolve.constants.ConstantValue; import org.jetbrains.kotlin.resolve.constants.EnumValue; import org.jetbrains.kotlin.resolve.constants.NullValue; -import org.jetbrains.kotlin.resolve.scopes.MemberScope; -import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; +import org.jetbrains.kotlin.synthetic.SamAdapterExtensionFunctionDescriptor; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.org.objectweb.asm.Type; @@ -411,7 +410,7 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { if (valueArguments == null) return; for (ValueParameterDescriptor valueParameter : original.getValueParameters()) { - SamType samType = SamType.create(valueParameter.getType()); + SamType samType = SamType.create(TypeMapperUtilsKt.removeExternalProjections(valueParameter.getType())); if (samType == null) continue; ResolvedValueArgument resolvedValueArgument = valueArguments.get(valueParameter.getIndex()); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMapperUtils.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMapperUtils.kt index 8437273baf9..01251803910 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMapperUtils.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMapperUtils.kt @@ -78,4 +78,9 @@ fun CallableMemberDescriptor.createTypeParameterWithNewName(descriptor: TypePara } newDescriptor.setInitialized() return newDescriptor +} + +fun KotlinType.removeExternalProjections(): KotlinType { + val newArguments = arguments.map { TypeProjectionImpl(Variance.INVARIANT, it.type) } + return replace(newArguments) } \ No newline at end of file diff --git a/compiler/testData/codegen/boxAgainstJava/sam/kt11519.kt b/compiler/testData/codegen/boxAgainstJava/sam/kt11519.kt new file mode 100644 index 00000000000..2cd32770696 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/kt11519.kt @@ -0,0 +1,39 @@ +// FILE: Custom.java + +class Custom { + private K k; + + private V v; + + public Custom(K k, V v) { + this.k = k; + this.v = v; + } + + public interface MBiConsumer { + void accept(T t, U u); + } + + public void forEach(MBiConsumer action) { + action.accept(k, v); + } +} + +// FILE: 1.kt + +import java.util.Arrays + +fun box(): String { + val instance = Custom("O", "K") + var result = "fail" + instance.forEach { a, b -> + result = a + b + } + + val superInterfaces = Arrays.toString((Class.forName("_1Kt\$box$1")).genericInterfaces) + if (superInterfaces != "[Custom.Custom\$MBiConsumer]") { + return "fail: $superInterfaces" + } + + return result +} diff --git a/compiler/testData/codegen/boxAgainstJava/sam/kt11519Constructor.kt b/compiler/testData/codegen/boxAgainstJava/sam/kt11519Constructor.kt new file mode 100644 index 00000000000..39a0471a54e --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/kt11519Constructor.kt @@ -0,0 +1,39 @@ +// FILE: Custom.java + +class Custom { + public interface MBiConsumer { + void accept(T t, U u); + } + + private K k; + + private V v; + + public Custom(K k, V v) { + this.k = k; + this.v = v; + } + + public void forEach(MBiConsumer action) { + action.accept(k, v); + } +} + +// FILE: 1.kt + +import java.util.Arrays + +fun box(): String { + val instance = Custom("O", "K") + var result = "fail" + instance.forEach (Custom.MBiConsumer { a, b -> + result = a + b + }) + + val superInterfaces = Arrays.toString((Class.forName("_1Kt\$box$1")).genericInterfaces) + if (superInterfaces != "[Custom.Custom\$MBiConsumer]") { + return "fail: $superInterfaces" + } + + return result +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java index 5b22116a121..d291b2538b3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -481,6 +481,18 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxAga doTest(fileName); } + @TestMetadata("kt11519.kt") + public void testKt11519() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/kt11519.kt"); + doTest(fileName); + } + + @TestMetadata("kt11519Constructor.kt") + public void testKt11519Constructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/kt11519Constructor.kt"); + doTest(fileName); + } + @TestMetadata("kt4753.kt") public void testKt4753() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/kt4753.kt");