From 12d8b189a94933647cc739d7b4e3e2da8ba0ea38 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 20 Jan 2022 10:26:45 +0300 Subject: [PATCH] JVM_IR KT-50856 fix generic signature for SAM proxy function --- .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ .../jvm/lower/FunctionReferenceLowering.kt | 3 ++- .../sam/functionRefToJavaInterface/kt50856.kt | 24 +++++++++++++++++++ .../sam/indySamConversionViaProxyFun.kt | 14 ++++++++++- .../sam/indySamConversionViaProxyFun.txt | 20 +++++++++------- .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ 6 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt50856.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 43790f2323f..4c844489901 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -23517,6 +23517,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt49613.kt"); } + @Test + @TestMetadata("kt50856.kt") + public void testKt50856() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt50856.kt"); + } + @Test @TestMetadata("localFunction1.kt") public void testLocalFunction1() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index 4ebd9abb517..2b541aa4fb0 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -335,7 +335,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) val proxyFun = context.irFactory.buildFun { name = Name.identifier("${targetFun.name.asString()}__proxy") - returnType = targetFun.returnType + returnType = targetFun.returnType.eraseTypeParameters() visibility = DescriptorVisibilities.LOCAL modality = Modality.FINAL isSuspend = false @@ -372,6 +372,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) updateFrom(originalParameter) name = Name.identifier("p$proxyParameterIndex\$${originalParameter.name.asString()}") index = proxyParameterIndex + type = originalParameter.type.eraseTypeParameters() proxyParameterIndex++ }.apply { parent = proxyFun diff --git a/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt50856.kt b/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt50856.kt new file mode 100644 index 00000000000..2a253bc45d4 --- /dev/null +++ b/compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt50856.kt @@ -0,0 +1,24 @@ +// TARGET_BACKEND: JVM_IR +// JVM_TARGET: 1.8 +// WITH_STDLIB +// FILE: box.kt +fun get(x: Sam): U = + x.get() + +fun test() { + get>(::mutableMapOf) +} + +fun box(): String { + test() + return "OK" +} + +// FILE: Sam.java +public interface Sam { + T get(); + + static void run() { + BoxKt.test(); + } +} diff --git a/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.kt b/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.kt index 63a9f73e8b5..8f3768c47b6 100644 --- a/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.kt +++ b/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.kt @@ -1,4 +1,6 @@ // IGNORE_BACKEND: JVM +// WITH_SIGNATURES +// WITH_STDLIB // FILE: indySamConversionViaProxyFun.kt.kt inline fun ifn() {} @@ -14,10 +16,15 @@ fun test() { // Proxy function for arrayOf fun should be non-synthetic use(Sam3(::intArrayOf)) + + // Proxy function for generic fun should have valid generic signature + use4>(::mutableMapOf) } fun use(x: Any) {} +fun use4(x: Sam4) {} + // FILE: Sam1.java public interface Sam1 { String get(String x, Object y); @@ -31,4 +38,9 @@ public interface Sam2 { // FILE: Sam3.java public interface Sam3 { int[] get(int[] s); -} \ No newline at end of file +} + +// FILE: Sam4.java +public interface Sam4 { + T get(); +} diff --git a/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.txt b/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.txt index 18f49f907f7..0412517e011 100644 --- a/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.txt +++ b/compiler/testData/codegen/bytecodeListing/sam/indySamConversionViaProxyFun.txt @@ -1,12 +1,14 @@ @kotlin.Metadata -public final class IndySamConversionViaProxyFun_ktKt { +public final class IndySamConversionViaProxyFun_ktKt { // source: 'indySamConversionViaProxyFun.kt.kt' - public final static method ifn(): void - private final static method test$ifn__proxy(): void - private varargs final static method test$intArrayOf__proxy(p0: int[]): int[] - private synthetic final static method test$plus__proxy(p0: java.lang.String, p1: java.lang.Object): java.lang.String - private synthetic final static method test$plus__proxy-0(p0: java.lang.String, p1: java.lang.Object): java.lang.String - private synthetic final static method test$plus__proxy-1(p0: java.lang.String, p1: java.lang.Object): java.lang.String - public final static method test(): void - public final static method use(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void + private final static <()Ljava/util/Map;> method test$mutableMapOf__proxy(): java.util.Map + public final static <(LSam4;)V> method use4(@org.jetbrains.annotations.NotNull p0: Sam4): void + public final static method ifn(): void + private final static method test$ifn__proxy(): void + private varargs final static method test$intArrayOf__proxy(p0: int[]): int[] + private synthetic final static method test$plus__proxy(p0: java.lang.String, p1: java.lang.Object): java.lang.String + private synthetic final static method test$plus__proxy-0(p0: java.lang.String, p1: java.lang.Object): java.lang.String + private synthetic final static method test$plus__proxy-1(p0: java.lang.String, p1: java.lang.Object): java.lang.String + public final static method test(): void + public final static method use(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void } diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 09d3adf31b2..8fe1c113b96 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -23517,6 +23517,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt49613.kt"); } + @Test + @TestMetadata("kt50856.kt") + public void testKt50856() throws Exception { + runTest("compiler/testData/codegen/box/invokedynamic/sam/functionRefToJavaInterface/kt50856.kt"); + } + @Test @TestMetadata("localFunction1.kt") public void testLocalFunction1() throws Exception {