From d65775ca1a8113c96ef67d99e4808fa9bf252b50 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Thu, 25 Aug 2022 12:33:52 +0200 Subject: [PATCH] KT-47475 Do not copy InnerClass attribute for WhenMapping classes --- .../codegen/inline/ObjectTransformer.kt | 7 +++++ .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ compiler/testData/codegen/box/when/kt47475.kt | 27 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 6 files changed, 57 insertions(+) create mode 100644 compiler/testData/codegen/box/when/kt47475.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt index 626766f759c..3cd637f6eec 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt @@ -83,6 +83,13 @@ class WhenMappingTransformer( methodNodes.add(this) } } + + override fun visitInnerClass(name: String?, outerName: String?, innerName: String?, access: Int) { + // Drop the attribute as the recreated class is not an inner class of the original outer class. + // In principle, we could also generate a new attribute with outerName set to the caller-side class, + // but that would require modification of both the inner (recreated) and the outer (caller-side) classes. + // The latter would require a lot of work without any clear benefits. + } }, ClassReader.SKIP_FRAMES) assert(methodNodes.size == 1) { 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 f1d2d523187..3ab2ddad6ef 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 @@ -50275,6 +50275,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/when/kt47365.kt"); } + @Test + @TestMetadata("kt47475.kt") + public void testKt47475() throws Exception { + runTest("compiler/testData/codegen/box/when/kt47475.kt"); + } + @Test @TestMetadata("kt5307.kt") public void testKt5307() throws Exception { diff --git a/compiler/testData/codegen/box/when/kt47475.kt b/compiler/testData/codegen/box/when/kt47475.kt new file mode 100644 index 00000000000..569e7ab63f9 --- /dev/null +++ b/compiler/testData/codegen/box/when/kt47475.kt @@ -0,0 +1,27 @@ +// TARGET_BACKEND: JVM +// CHECK_BYTECODE_TEXT + +// MODULE: lib +// FILE: lib.kt + +enum class SomeEnum{A, B} + +inline fun inlineEnumWhen(someEnum: SomeEnum) = when(someEnum) { + SomeEnum.A -> "A" + else -> "not A" +} + +// JVM_IR_TEMPLATES +// 2 INNERCLASS + +// MODULE: caller(lib) +// FILE: caller.kt + +fun box(): String { + inlineEnumWhen(SomeEnum.A) + val mappings = Class.forName("CallerKt\$box\$\$inlined\$inlineEnumWhen\$1\$wm\$LibKt\$WhenMappings") + return if (mappings.enclosingClass == null) "OK" else "FAIL" +} + +// JVM_IR_TEMPLATES +// 0 INNERCLASS \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 0dd6c72d848..0f2af663dac 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -48739,6 +48739,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/when/kt47365.kt"); } + @Test + @TestMetadata("kt47475.kt") + public void testKt47475() throws Exception { + runTest("compiler/testData/codegen/box/when/kt47475.kt"); + } + @Test @TestMetadata("kt5307.kt") public void testKt5307() throws Exception { 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 68a2784ee95..d1f1fe38413 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 @@ -50275,6 +50275,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/when/kt47365.kt"); } + @Test + @TestMetadata("kt47475.kt") + public void testKt47475() throws Exception { + runTest("compiler/testData/codegen/box/when/kt47475.kt"); + } + @Test @TestMetadata("kt5307.kt") public void testKt5307() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index c142cffa438..58225e2d620 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -39608,6 +39608,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/when/kt47365.kt"); } + @TestMetadata("kt47475.kt") + public void testKt47475() throws Exception { + runTest("compiler/testData/codegen/box/when/kt47475.kt"); + } + @TestMetadata("kt5307.kt") public void testKt5307() throws Exception { runTest("compiler/testData/codegen/box/when/kt5307.kt");