From e38ff8753e8045c0c9d941738dc20c4e578bf2e7 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 23 Sep 2019 20:24:36 +0300 Subject: [PATCH] JVM_IR: support type parameters in @JvmOverload functions --- .../lower/JvmOverloadsAnnotationLowering.kt | 4 ++++ .../box/jvmOverloads/typeParameters.kt | 23 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 ++++ 5 files changed, 42 insertions(+) create mode 100644 compiler/testData/codegen/box/jvmOverloads/typeParameters.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt index 3df38545e53..172245bcf64 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl +import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_OVERLOADS_FQ_NAME @@ -59,6 +60,9 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C IrDelegatingConstructorCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType, target.symbol, target.descriptor) else IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target.symbol) + for (arg in wrapperIrFunction.typeParameters) { + call.putTypeArgument(arg.index, arg.defaultType) + } call.dispatchReceiver = wrapperIrFunction.dispatchReceiverParameter?.let { dispatchReceiver -> IrGetValueImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, diff --git a/compiler/testData/codegen/box/jvmOverloads/typeParameters.kt b/compiler/testData/codegen/box/jvmOverloads/typeParameters.kt new file mode 100644 index 00000000000..27c796bf37e --- /dev/null +++ b/compiler/testData/codegen/box/jvmOverloads/typeParameters.kt @@ -0,0 +1,23 @@ +// TARGET_BACKEND: JVM + +// WITH_RUNTIME + +// FILE: box.kt +class C { + @kotlin.jvm.JvmOverloads public fun foo(x: X, s: String = "OK"): String { + return s + } +} + +fun box(): String { + return A().test() +} + +// FILE: A.java + +public class A { + public String test() { + return new C().foo(42); + } +} + diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 5c521576b25..bc1f23ace75 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -15159,6 +15159,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt"); } + @TestMetadata("typeParameters.kt") + public void testTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/jvmOverloads/typeParameters.kt"); + } + @TestMetadata("varargs.kt") public void testVarargs() throws Exception { runTest("compiler/testData/codegen/box/jvmOverloads/varargs.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 931a913d92e..cd41d7f3c6c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -15159,6 +15159,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt"); } + @TestMetadata("typeParameters.kt") + public void testTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/jvmOverloads/typeParameters.kt"); + } + @TestMetadata("varargs.kt") public void testVarargs() throws Exception { runTest("compiler/testData/codegen/box/jvmOverloads/varargs.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index a232b96ead2..0dec818837b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -14044,6 +14044,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt"); } + @TestMetadata("typeParameters.kt") + public void testTypeParameters() throws Exception { + runTest("compiler/testData/codegen/box/jvmOverloads/typeParameters.kt"); + } + @TestMetadata("varargs.kt") public void testVarargs() throws Exception { runTest("compiler/testData/codegen/box/jvmOverloads/varargs.kt");