From 80289e4a3ff916213ddf598c56b126b0bc5cb844 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Tue, 29 Dec 2020 07:59:29 +0100 Subject: [PATCH] IC Mangling: Generate inline class literal instead of underlying type literal in annotations. #KT-30280 Fixed --- .../kotlin/codegen/AnnotationCodegen.java | 4 ++++ .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../backend/jvm/codegen/AnnotationCodegen.kt | 5 ++++- .../box/inlineClasses/kclassInAnnotation.kt | 16 ++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ 7 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/kclassInAnnotation.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java index 2ffacdd6f48..c44172f262d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.AnnotationChecker; import org.jetbrains.kotlin.resolve.DescriptorUtils; +import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt; import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker; import org.jetbrains.kotlin.resolve.constants.*; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; @@ -497,6 +498,9 @@ public abstract class AnnotationCodegen { public Void visitKClassValue(KClassValue value, Void data) { KotlinType classType = value.getArgumentType(module); innerClassConsumer.addInnerClassInfoFromAnnotation(DescriptorUtils.getClassDescriptorForType(classType)); + if (InlineClassesUtilsKt.isInlineClassType(classType)) { + classType = TypeUtils.makeNullable(classType); + } annotationVisitor.visit(name, typeMapper.mapType(classType)); return null; } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index ec7f7882421..14cc6ac517f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -13987,6 +13987,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); } + @TestMetadata("kclassInAnnotation.kt") + public void testKclassInAnnotation() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kclassInAnnotation.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt"); diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt index 1c0e59c8543..6217fba9a38 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt @@ -272,8 +272,11 @@ abstract class AnnotationCodegen( visitor.visitEnd() } is IrClassReference -> { - val classType = value.classType + var classType = value.classType classType.classOrNull?.owner?.let(innerClassConsumer::addInnerClassInfoFromAnnotation) + if (classType.isInlined()) { + classType = classType.makeNullable() + } annotationVisitor.visit(name, typeMapper.mapType(classType)) } is IrErrorExpression -> error("Don't know how to compile annotation value ${ir2string(value)}") diff --git a/compiler/testData/codegen/box/inlineClasses/kclassInAnnotation.kt b/compiler/testData/codegen/box/inlineClasses/kclassInAnnotation.kt new file mode 100644 index 00000000000..933f9e9ccf3 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kclassInAnnotation.kt @@ -0,0 +1,16 @@ +// WITH_REFLECT +// TARGET_BACKEND: JVM + +import kotlin.reflect.KClass + +inline class IC(val i: Int) + +annotation class Ann(val c: KClass<*>) + +@Ann(IC::class) +class C + +fun box(): String { + val klass = (C::class.annotations.first() as Ann).c.toString() + return if (klass == "class IC") "OK" else klass +} \ No newline at end of file diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index be970c35be3..aa9727d8756 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13987,6 +13987,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); } + @TestMetadata("kclassInAnnotation.kt") + public void testKclassInAnnotation() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kclassInAnnotation.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 778943165cb..d4afe6337ce 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13997,6 +13997,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); } + @TestMetadata("kclassInAnnotation.kt") + public void testKclassInAnnotation() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kclassInAnnotation.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index a500d9a9d3a..637ce137d5b 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -13987,6 +13987,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); } + @TestMetadata("kclassInAnnotation.kt") + public void testKclassInAnnotation() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kclassInAnnotation.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");