From b1bce6a29e221a4f893e79c213dad53c2b0a51ca Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 17 Aug 2021 18:24:51 +0200 Subject: [PATCH] JVM IR: fix noarg plugin for sealed class with existing noarg ctor #KT-48111 Fixed --- .../noarg-cli/src/NoArgIrGenerationExtension.kt | 12 +++++++----- .../BlackBoxCodegenTestForNoArgGenerated.java | 5 +++++ .../IrBlackBoxCodegenTestForNoArgGenerated.java | 5 +++++ .../box/sealedClassWithExistingNoargCtor.kt | 14 ++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 plugins/noarg/noarg-cli/testData/box/sealedClassWithExistingNoargCtor.kt diff --git a/plugins/noarg/noarg-cli/src/NoArgIrGenerationExtension.kt b/plugins/noarg/noarg-cli/src/NoArgIrGenerationExtension.kt index 8619438f207..04ce4f9d519 100644 --- a/plugins/noarg/noarg-cli/src/NoArgIrGenerationExtension.kt +++ b/plugins/noarg/noarg-cli/src/NoArgIrGenerationExtension.kt @@ -50,10 +50,7 @@ private class NoArgIrTransformer( override fun visitClass(declaration: IrClass) { super.visitClass(declaration) - if (declaration.kind == ClassKind.CLASS && - declaration.isAnnotatedWithNoarg() && - declaration.constructors.none { it.isZeroParameterConstructor() } - ) { + if (needsNoargConstructor(declaration)) { declaration.declarations.add(getOrGenerateNoArgConstructor(declaration)) } } @@ -66,7 +63,7 @@ private class NoArgIrTransformer( ?: context.irBuiltIns.anyClass.owner val superConstructor = - if (superClass.isAnnotatedWithNoarg()) + if (needsNoargConstructor(superClass)) getOrGenerateNoArgConstructor(superClass) else superClass.constructors.singleOrNull { it.isZeroParameterConstructor() } ?: error("No noarg super constructor for ${klass.render()}:\n" + superClass.constructors.joinToString("\n") { it.render() }) @@ -90,6 +87,11 @@ private class NoArgIrTransformer( } } + private fun needsNoargConstructor(declaration: IrClass): Boolean = + declaration.kind == ClassKind.CLASS && + declaration.isAnnotatedWithNoarg() && + declaration.constructors.none { it.isZeroParameterConstructor() } + private fun IrClass.isAnnotatedWithNoarg(): Boolean = toIrBasedDescriptor().hasSpecialAnnotation(null) diff --git a/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/BlackBoxCodegenTestForNoArgGenerated.java b/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/BlackBoxCodegenTestForNoArgGenerated.java index abeb0910d77..143764a08fa 100644 --- a/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/BlackBoxCodegenTestForNoArgGenerated.java +++ b/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/BlackBoxCodegenTestForNoArgGenerated.java @@ -65,6 +65,11 @@ public class BlackBoxCodegenTestForNoArgGenerated extends AbstractBlackBoxCodege runTest("plugins/noarg/noarg-cli/testData/box/nestedClass.kt"); } + @TestMetadata("sealedClassWithExistingNoargCtor.kt") + public void testSealedClassWithExistingNoargCtor() throws Exception { + runTest("plugins/noarg/noarg-cli/testData/box/sealedClassWithExistingNoargCtor.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("plugins/noarg/noarg-cli/testData/box/simple.kt"); diff --git a/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/IrBlackBoxCodegenTestForNoArgGenerated.java b/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/IrBlackBoxCodegenTestForNoArgGenerated.java index 28c905de0d3..dffc0401dfe 100644 --- a/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/IrBlackBoxCodegenTestForNoArgGenerated.java +++ b/plugins/noarg/noarg-cli/test/org/jetbrains/kotlin/noarg/IrBlackBoxCodegenTestForNoArgGenerated.java @@ -65,6 +65,11 @@ public class IrBlackBoxCodegenTestForNoArgGenerated extends AbstractIrBlackBoxCo runTest("plugins/noarg/noarg-cli/testData/box/nestedClass.kt"); } + @TestMetadata("sealedClassWithExistingNoargCtor.kt") + public void testSealedClassWithExistingNoargCtor() throws Exception { + runTest("plugins/noarg/noarg-cli/testData/box/sealedClassWithExistingNoargCtor.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("plugins/noarg/noarg-cli/testData/box/simple.kt"); diff --git a/plugins/noarg/noarg-cli/testData/box/sealedClassWithExistingNoargCtor.kt b/plugins/noarg/noarg-cli/testData/box/sealedClassWithExistingNoargCtor.kt new file mode 100644 index 00000000000..bc708ee386e --- /dev/null +++ b/plugins/noarg/noarg-cli/testData/box/sealedClassWithExistingNoargCtor.kt @@ -0,0 +1,14 @@ +// WITH_RUNTIME + +annotation class NoArg + +@NoArg +sealed class MappedSuperClass + +@NoArg +class ConcreteClass(val x: String) : MappedSuperClass() + +fun box(): String { + ConcreteClass::class.java.getConstructor().newInstance() + return "OK" +}