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 2ba7191e535..05e4dfe4678 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java @@ -797,7 +797,7 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { if (valueArgument == null || newResolvedCall.getExpectedTypeForSamConvertedArgument(valueArgument) == null) continue; - valueParametersWithSAMConversion.add(valueParameter.getOriginal()); + valueParametersWithSAMConversion.add(valueParameter); } writeSamValueForValueParameters(valueParametersWithSAMConversion, newResolvedCall.getValueArgumentsByIndex()); diff --git a/compiler/testData/codegen/box/sam/recordSubstitutedTypeForCallableSamParameter.kt b/compiler/testData/codegen/box/sam/recordSubstitutedTypeForCallableSamParameter.kt new file mode 100644 index 00000000000..613218c6f03 --- /dev/null +++ b/compiler/testData/codegen/box/sam/recordSubstitutedTypeForCallableSamParameter.kt @@ -0,0 +1,92 @@ +// !LANGUAGE: +NewInference +SamConversionPerArgument +SamConversionForKotlinFunctions +FunctionalInterfaceConversion +// WITH_REFLECT +// FULL_JDK +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM + +// FILE: Provider.java + +public class Provider { + public String samCall(java.util.concurrent.Callable value) { + return "fail"; + } +} + +// FILE: test.kt + +import java.util.concurrent.Callable +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type +import kotlin.reflect.KClass +import kotlin.test.assertEquals + +private fun getFirstArgumentType(types: Array, klass: KClass<*>): String { + return types + .filterIsInstance() + .firstOrNull { it.rawType == klass.java } + ?.let { it.actualTypeArguments[0] } + ?.toString() ?: "fail, inferred type is null" +} + +class KtProvider : Provider() { + override fun samCall(value: Callable): String = + getFirstArgumentType(value.javaClass.genericInterfaces, Callable::class) +} + +fun interface KtCallable { + fun invoke(): T +} + +fun samCallViaFunInterface(value: KtCallable): String { + return getFirstArgumentType(value.javaClass.genericInterfaces, KtCallable::class) +} + +fun testCallViaJava(p: Provider): String { + var result = "not changed" + wrapInline { + wrapNoInline { + result = p.samCall { "str" } + } + } + return result +} + +fun testCallViaKotlin(p: KtProvider): String { + var result = "not changed" + wrapInline { + wrapNoInline { + result = p.samCall { "str" } + } + } + return result +} + +fun testCallViaFunInterface(): String { + var result = "not changed" + wrapInline { + wrapNoInline { + result = samCallViaFunInterface { "str" } + } + } + return result +} + + +inline fun wrapInline(f: () -> Unit) { + f() +} + +fun wrapNoInline(f: () -> Unit) { + f() +} + +fun box(): String { + val inferredTypeInSamLambda1 = testCallViaJava(KtProvider()) + val inferredTypeInSamLambda2 = testCallViaKotlin(KtProvider()) + val inferredTypeInSamLambda3 = testCallViaFunInterface() + + assertEquals(inferredTypeInSamLambda1, inferredTypeInSamLambda2) + assertEquals(inferredTypeInSamLambda2, inferredTypeInSamLambda3) + + return if (inferredTypeInSamLambda1 == "class java.lang.String") "OK" else "fail: $inferredTypeInSamLambda1" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 160929a2ab5..66b9b2b41dc 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -26536,6 +26536,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/sam/receiverEvaluatedOnce.kt"); } + @TestMetadata("recordSubstitutedTypeForCallableSamParameter.kt") + public void testRecordSubstitutedTypeForCallableSamParameter() throws Exception { + runTest("compiler/testData/codegen/box/sam/recordSubstitutedTypeForCallableSamParameter.kt"); + } + @TestMetadata("compiler/testData/codegen/box/sam/constructors") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 10b2df7278f..6c6f73ab5c5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -25353,6 +25353,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/sam/receiverEvaluatedOnce.kt"); } + @TestMetadata("recordSubstitutedTypeForCallableSamParameter.kt") + public void testRecordSubstitutedTypeForCallableSamParameter() throws Exception { + runTest("compiler/testData/codegen/box/sam/recordSubstitutedTypeForCallableSamParameter.kt"); + } + @TestMetadata("compiler/testData/codegen/box/sam/constructors") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index e5ebe375170..be97208fd5f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -25060,6 +25060,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/sam/receiverEvaluatedOnce.kt"); } + @TestMetadata("recordSubstitutedTypeForCallableSamParameter.kt") + public void testRecordSubstitutedTypeForCallableSamParameter() throws Exception { + runTest("compiler/testData/codegen/box/sam/recordSubstitutedTypeForCallableSamParameter.kt"); + } + @TestMetadata("compiler/testData/codegen/box/sam/constructors") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 56fcce64068..8a14daf2474 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -25060,6 +25060,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/sam/receiverEvaluatedOnce.kt"); } + @TestMetadata("recordSubstitutedTypeForCallableSamParameter.kt") + public void testRecordSubstitutedTypeForCallableSamParameter() throws Exception { + runTest("compiler/testData/codegen/box/sam/recordSubstitutedTypeForCallableSamParameter.kt"); + } + @TestMetadata("compiler/testData/codegen/box/sam/constructors") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)