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 f486bffcc47..fff3d1ff96f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java @@ -881,6 +881,9 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { DeclarationDescriptor operationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getOperationReference()); if (!(operationDescriptor instanceof FunctionDescriptor)) return; + ResolvedCall resolvedCall = CallUtilKt.getResolvedCall(expression, bindingContext); + if (resolvedCall != null) recordSamValueForNewInference(resolvedCall); + FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter((FunctionDescriptor) operationDescriptor); if (original == null) return; @@ -903,6 +906,9 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { DeclarationDescriptor operationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, expression); if (!(operationDescriptor instanceof FunctionDescriptor)) return; + ResolvedCall resolvedCall = CallUtilKt.getResolvedCall(expression, bindingContext); + if (resolvedCall != null) recordSamValueForNewInference(resolvedCall); + boolean isSetter = operationDescriptor.getName().asString().equals("set"); FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter((FunctionDescriptor) operationDescriptor); if (original == null) return; diff --git a/compiler/testData/codegen/box/javaInterop/genericSamProjectedOutWithNewInference.kt b/compiler/testData/codegen/box/javaInterop/genericSamProjectedOutWithNewInference.kt new file mode 100644 index 00000000000..892d86441ea --- /dev/null +++ b/compiler/testData/codegen/box/javaInterop/genericSamProjectedOutWithNewInference.kt @@ -0,0 +1,79 @@ +// !LANGUAGE: +NewInference +// TARGET_BACKEND: JVM +// IGNORE_BACKEND: JVM_IR + +// FILE: example/Hello.java + +package example; + +@FunctionalInterface +public interface Hello { + void invoke(A a); +} + +// FILE: example/SomeJavaClass.java +package example; + +public class SomeJavaClass { + public void someFunction(Hello hello) { + ((Hello)hello).invoke("OK"); + } + + public SomeJavaClass plus(Hello hello) { + ((Hello)hello).invoke("OK"); + return this; + } + + public void get(Hello hello) { + ((Hello)hello).invoke("OK"); + } + + public void set(int i, Hello hello) { + ((Hello)hello).invoke("OK"); + } +} + +// FILE: main.kt +import example.SomeJavaClass + +fun box(): String { + var a: SomeJavaClass = SomeJavaClass() + + var result = "fail" + + a.someFunction { + result = it + } + + if (result != "OK") return "fail 1: $result" + result = "fail" + + a + { + result = it + } + + if (result != "OK") return "fail 2: $result" + result = "fail" + + a[{ + result = it + }] + + if (result != "OK") return "fail 3: $result" + + result = "fail" + + a += { + result = it + } + + if (result != "OK") return "fail 4: $result" + + result = "fail" + + a[0] = { result = it } + + if (result != "OK") return "fail 5: $result" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 55f7fff2d79..2bd922bc68a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13491,6 +13491,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/javaInterop/genericSamProjectedOut.kt"); } + @TestMetadata("genericSamProjectedOutWithNewInference.kt") + public void testGenericSamProjectedOutWithNewInference() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/genericSamProjectedOutWithNewInference.kt"); + } + @TestMetadata("lambdaInstanceOf.kt") public void testLambdaInstanceOf() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/lambdaInstanceOf.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 93e5b5c792e..05d54a6e995 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13491,6 +13491,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/javaInterop/genericSamProjectedOut.kt"); } + @TestMetadata("genericSamProjectedOutWithNewInference.kt") + public void testGenericSamProjectedOutWithNewInference() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/genericSamProjectedOutWithNewInference.kt"); + } + @TestMetadata("lambdaInstanceOf.kt") public void testLambdaInstanceOf() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/lambdaInstanceOf.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 4b29579ef19..ec31b13d41a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -13496,6 +13496,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaInterop/genericSamProjectedOut.kt"); } + @TestMetadata("genericSamProjectedOutWithNewInference.kt") + public void testGenericSamProjectedOutWithNewInference() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/genericSamProjectedOutWithNewInference.kt"); + } + @TestMetadata("lambdaInstanceOf.kt") public void testLambdaInstanceOf() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/lambdaInstanceOf.kt");