From 6a21285aedaee49a49f9dcd20de46631dd526bd9 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 24 Jun 2019 11:04:46 +0200 Subject: [PATCH] JVM_IR: do not generate two nullary constructors when the primary constructor with @JvmOverloads has default values for all arguments. --- .../src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt | 2 +- .../jvm/lower/JvmDefaultConstructorLowering.kt | 3 ++- .../primaryConstructorWithAllDefaults.kt | 12 ++++++++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ 6 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/jvmOverloads/primaryConstructorWithAllDefaults.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 3afce5fdfbe..47baf8f6fd4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -115,7 +115,6 @@ val jvmPhases = namedIrFilePhase( annotationPhase then tailrecPhase then - jvmDefaultConstructorPhase then jvmInlineClassPhase then defaultArgumentStubPhase then @@ -146,6 +145,7 @@ val jvmPhases = namedIrFilePhase( collectionStubMethodLowering then bridgePhase then jvmOverloadsAnnotationPhase then + jvmDefaultConstructorPhase then jvmStaticAnnotationPhase then staticDefaultFunctionPhase then diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt index 985d78b784a..957bf7d1a35 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt @@ -20,7 +20,8 @@ import org.jetbrains.kotlin.ir.util.hasDefaultValue internal val jvmDefaultConstructorPhase = makeIrFilePhase( ::JvmDefaultConstructorLowering, name = "JvmDefaultConstructor", - description = "Generate default constructors for Java" + description = "Generate default constructors for Java", + prerequisite = setOf(jvmOverloadsAnnotationPhase) ) // Quoted from https://kotlinlang.org/docs/reference/classes.html diff --git a/compiler/testData/codegen/box/jvmOverloads/primaryConstructorWithAllDefaults.kt b/compiler/testData/codegen/box/jvmOverloads/primaryConstructorWithAllDefaults.kt new file mode 100644 index 00000000000..a77c0b54757 --- /dev/null +++ b/compiler/testData/codegen/box/jvmOverloads/primaryConstructorWithAllDefaults.kt @@ -0,0 +1,12 @@ +// TARGET_BACKEND: JVM + +// WITH_RUNTIME + +class C @kotlin.jvm.JvmOverloads constructor(s1: String = "O", s2: String = "K") { + public val status: String = s1 + s2 +} + +fun box(): String { + val c = (C::class.java.getConstructor().newInstance()) + return c.status +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 2560619c152..eead5ac848e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -14879,6 +14879,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/jvmOverloads/primaryConstructor.kt"); } + @TestMetadata("primaryConstructorWithAllDefaults.kt") + public void testPrimaryConstructorWithAllDefaults() throws Exception { + runTest("compiler/testData/codegen/box/jvmOverloads/primaryConstructorWithAllDefaults.kt"); + } + @TestMetadata("privateClass.kt") public void testPrivateClass() throws Exception { runTest("compiler/testData/codegen/box/jvmOverloads/privateClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index a0b53b95211..f8f995e5a43 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -14879,6 +14879,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvmOverloads/primaryConstructor.kt"); } + @TestMetadata("primaryConstructorWithAllDefaults.kt") + public void testPrimaryConstructorWithAllDefaults() throws Exception { + runTest("compiler/testData/codegen/box/jvmOverloads/primaryConstructorWithAllDefaults.kt"); + } + @TestMetadata("privateClass.kt") public void testPrivateClass() throws Exception { runTest("compiler/testData/codegen/box/jvmOverloads/privateClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 69d779f3925..c22e952a510 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -14884,6 +14884,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvmOverloads/primaryConstructor.kt"); } + @TestMetadata("primaryConstructorWithAllDefaults.kt") + public void testPrimaryConstructorWithAllDefaults() throws Exception { + runTest("compiler/testData/codegen/box/jvmOverloads/primaryConstructorWithAllDefaults.kt"); + } + @TestMetadata("privateClass.kt") public void testPrivateClass() throws Exception { runTest("compiler/testData/codegen/box/jvmOverloads/privateClass.kt");