From 51ce829b96adc64ac363f989c26cb7f1f2596bb7 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 29 Sep 2022 01:33:24 +0200 Subject: [PATCH] Fix reflection class lookup in default package Do not append "." to the name of the class in the default package. --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../onTypes/arrayTypeInDefaultPackage.kt | 20 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../src/kotlin/reflect/jvm/internal/util.kt | 17 +++++++++++++--- 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/reflection/annotations/onTypes/arrayTypeInDefaultPackage.kt 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 b473a20fda2..3d11c82997b 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 @@ -41679,6 +41679,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/arrayKClass.kt"); } + @Test + @TestMetadata("arrayTypeInDefaultPackage.kt") + public void testArrayTypeInDefaultPackage() throws Exception { + runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/arrayTypeInDefaultPackage.kt"); + } + @Test @TestMetadata("classLiteralWithExpectedType.kt") public void testClassLiteralWithExpectedType() throws Exception { diff --git a/compiler/testData/codegen/box/reflection/annotations/onTypes/arrayTypeInDefaultPackage.kt b/compiler/testData/codegen/box/reflection/annotations/onTypes/arrayTypeInDefaultPackage.kt new file mode 100644 index 00000000000..8de861f374a --- /dev/null +++ b/compiler/testData/codegen/box/reflection/annotations/onTypes/arrayTypeInDefaultPackage.kt @@ -0,0 +1,20 @@ +// TARGET_BACKEND: JVM +// WITH_REFLECT + +import kotlin.reflect.KClass +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +annotation class Nested(val value: String) + +@Target(AnnotationTarget.TYPE) +annotation class Anno( + val aa: Array, +) + +fun f(): @Anno([Nested("OK")]) Unit {} + +fun box(): String { + val anno = ::f.returnType.annotations.single() as Anno + return anno.aa[0].value +} 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 57cffefec87..ae6d4335b49 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 @@ -40245,6 +40245,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/arrayKClass.kt"); } + @Test + @TestMetadata("arrayTypeInDefaultPackage.kt") + public void testArrayTypeInDefaultPackage() throws Exception { + runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/arrayTypeInDefaultPackage.kt"); + } + @Test @TestMetadata("classLiteralWithExpectedType.kt") public void testClassLiteralWithExpectedType() 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 947d788795e..c76b458b986 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 @@ -41679,6 +41679,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/arrayKClass.kt"); } + @Test + @TestMetadata("arrayTypeInDefaultPackage.kt") + public void testArrayTypeInDefaultPackage() throws Exception { + runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/arrayTypeInDefaultPackage.kt"); + } + @Test @TestMetadata("classLiteralWithExpectedType.kt") public void testClassLiteralWithExpectedType() 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 eaa2d5448e8..42169916252 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -32100,6 +32100,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/arrayKClass.kt"); } + @TestMetadata("arrayTypeInDefaultPackage.kt") + public void testArrayTypeInDefaultPackage() throws Exception { + runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/arrayTypeInDefaultPackage.kt"); + } + @TestMetadata("classLiteralWithExpectedType.kt") public void testClassLiteralWithExpectedType() throws Exception { runTest("compiler/testData/codegen/box/reflection/annotations/onTypes/classLiteralWithExpectedType.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt index f654b0a8f29..9f27364dd39 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt @@ -97,9 +97,20 @@ private fun loadClass(classLoader: ClassLoader, packageName: String, className: } } - var fqName = "$packageName.${className.replace('.', '$')}" - if (arrayDimensions > 0) { - fqName = "[".repeat(arrayDimensions) + "L$fqName;" + val fqName = buildString { + if (arrayDimensions > 0) { + repeat(arrayDimensions) { + append("[") + } + append("L") + } + if (packageName.isNotEmpty()) { + append("$packageName.") + } + append(className.replace('.', '$')) + if (arrayDimensions > 0) { + append(";") + } } return classLoader.tryLoadClass(fqName)