diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index 3205ceb1300..aaed2503b73 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -169,7 +169,10 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : SyntheticScope } - val sourceFunctionSubstitutor = TypeSubstitutor.create(substitutionMap) + val sourceFunctionSubstitutor = + TypeConstructorSubstitution.createByConstructorsMap( + substitutionMap, configuration.originalSubstitutor.substitution.approximateCapturedTypes()).buildSubstitutor() + descriptor.sourceFunction = original.sourceFunction.substitute(sourceFunctionSubstitutor) return descriptor diff --git a/compiler/testData/codegen/boxAgainstJava/sam/kt11696.kt b/compiler/testData/codegen/boxAgainstJava/sam/kt11696.kt new file mode 100644 index 00000000000..db2db8e78bf --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/kt11696.kt @@ -0,0 +1,35 @@ +// FILE: Promise.java +import org.jetbrains.annotations.NotNull; + +interface Consumer { + void consume(T t); +} + +public abstract class Promise { + @NotNull + public abstract Promise done(@NotNull Consumer done); +} + +// FILE: 1.kt +class User { + fun use(promise: Promise<*>): Promise<*> { + promise.done { } + return promise + } +} + +fun box(): String { + var result = "" + User().use( + object : Promise() { + override fun done(x: Consumer): Promise { + result = x.javaClass.genericInterfaces[0].toString() + return this + } + } + ) + + if (result != "Consumer") return "fail: $result" + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java index d291b2538b3..fbfb48857a2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -493,6 +493,12 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxAga doTest(fileName); } + @TestMetadata("kt11696.kt") + public void testKt11696() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/kt11696.kt"); + doTest(fileName); + } + @TestMetadata("kt4753.kt") public void testKt4753() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/kt4753.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt index c0db900c625..93f30eea061 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt @@ -47,10 +47,16 @@ abstract class TypeConstructorSubstitution : TypeSubstitution() { abstract fun get(key: TypeConstructor): TypeProjection? companion object { - @JvmStatic fun createByConstructorsMap(map: Map): TypeConstructorSubstitution = + @JvmStatic + @JvmOverloads + fun createByConstructorsMap( + map: Map, + approximateCapturedTypes: Boolean = false + ): TypeConstructorSubstitution = object : TypeConstructorSubstitution() { override fun get(key: TypeConstructor) = map[key] override fun isEmpty() = map.isEmpty() + override fun approximateCapturedTypes() = approximateCapturedTypes } @JvmStatic fun createByParametersMap(map: Map): TypeConstructorSubstitution =