From a8488cf2986792fac72ec13e747db817d78e329d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 23 Apr 2018 13:58:47 +0200 Subject: [PATCH] Fix JvmOverloads generation for actual methods `countDefaultParameters` uses `hasDefaultValue` to compute the number of parameters which have default values, which handles actual parameters (who have default values in the expected declaration) correctly. Thus, `getRemainingParameters` should use it as well to determine the list of parameters to be skipped in each generated overload #KT-23910 Fixed --- .../DefaultParameterValueSubstitutor.kt | 2 +- .../defaultArguments/jvmOverloads.kt | 31 +++++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/multiplatform/defaultArguments/jvmOverloads.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index fe389cbb6b9..6f8f27964ac 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -240,7 +240,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { private fun getRemainingParameters(functionDescriptor: FunctionDescriptor, substituteCount: Int): List { var remainingCount = functionDescriptor.countDefaultParameters() - substituteCount - return functionDescriptor.valueParameters.filter { !it.declaresDefaultValue() || --remainingCount >= 0 } + return functionDescriptor.valueParameters.filter { !it.hasDefaultValue() || --remainingCount >= 0 } } private fun isEmptyConstructorNeeded(constructorDescriptor: ConstructorDescriptor, classOrObject: KtPureClassOrObject): Boolean { diff --git a/compiler/testData/codegen/box/multiplatform/defaultArguments/jvmOverloads.kt b/compiler/testData/codegen/box/multiplatform/defaultArguments/jvmOverloads.kt new file mode 100644 index 00000000000..700e90f9b5f --- /dev/null +++ b/compiler/testData/codegen/box/multiplatform/defaultArguments/jvmOverloads.kt @@ -0,0 +1,31 @@ +// !LANGUAGE: +MultiPlatformProjects +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// FILE: J.java + +public class J { + public static String test() { + JvmKt.foo(-1); + JvmKt.foo(5, 5); + return "OK"; + } +} + +// FILE: common.kt + +expect fun foo(j: Int, i: Int = -1) + +// FILE: jvm.kt + +import kotlin.test.assertEquals + +@JvmOverloads +actual fun foo(j: Int, i: Int) { + assertEquals(j, i) +} + +fun box(): String { + foo(-1) + foo(5, 5) + return J.test(); +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index d6ff003c4ce..7267f6d3f3b 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -13288,6 +13288,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/inlineFunctionWithDefaultLambda.kt"); } + @TestMetadata("jvmOverloads.kt") + public void testJvmOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/jvmOverloads.kt"); + } + @TestMetadata("kt23239.kt") public void testKt23239() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23239.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 6826437f7d7..3383af29e71 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13288,6 +13288,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/inlineFunctionWithDefaultLambda.kt"); } + @TestMetadata("jvmOverloads.kt") + public void testJvmOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/jvmOverloads.kt"); + } + @TestMetadata("kt23239.kt") public void testKt23239() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23239.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 56657a495f1..29e44734eeb 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13288,6 +13288,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/inlineFunctionWithDefaultLambda.kt"); } + @TestMetadata("jvmOverloads.kt") + public void testJvmOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/jvmOverloads.kt"); + } + @TestMetadata("kt23239.kt") public void testKt23239() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23239.kt");