IC Mangling: Generate inline class literal instead of underlying type
literal in annotations. #KT-30280 Fixed
This commit is contained in:
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.name.FqName;
|
|||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.resolve.AnnotationChecker;
|
import org.jetbrains.kotlin.resolve.AnnotationChecker;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
|
import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt;
|
||||||
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker;
|
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker;
|
||||||
import org.jetbrains.kotlin.resolve.constants.*;
|
import org.jetbrains.kotlin.resolve.constants.*;
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
|
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
|
||||||
@@ -497,6 +498,9 @@ public abstract class AnnotationCodegen {
|
|||||||
public Void visitKClassValue(KClassValue value, Void data) {
|
public Void visitKClassValue(KClassValue value, Void data) {
|
||||||
KotlinType classType = value.getArgumentType(module);
|
KotlinType classType = value.getArgumentType(module);
|
||||||
innerClassConsumer.addInnerClassInfoFromAnnotation(DescriptorUtils.getClassDescriptorForType(classType));
|
innerClassConsumer.addInnerClassInfoFromAnnotation(DescriptorUtils.getClassDescriptorForType(classType));
|
||||||
|
if (InlineClassesUtilsKt.isInlineClassType(classType)) {
|
||||||
|
classType = TypeUtils.makeNullable(classType);
|
||||||
|
}
|
||||||
annotationVisitor.visit(name, typeMapper.mapType(classType));
|
annotationVisitor.visit(name, typeMapper.mapType(classType));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+5
@@ -13987,6 +13987,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
|
|||||||
+4
-1
@@ -272,8 +272,11 @@ abstract class AnnotationCodegen(
|
|||||||
visitor.visitEnd()
|
visitor.visitEnd()
|
||||||
}
|
}
|
||||||
is IrClassReference -> {
|
is IrClassReference -> {
|
||||||
val classType = value.classType
|
var classType = value.classType
|
||||||
classType.classOrNull?.owner?.let(innerClassConsumer::addInnerClassInfoFromAnnotation)
|
classType.classOrNull?.owner?.let(innerClassConsumer::addInnerClassInfoFromAnnotation)
|
||||||
|
if (classType.isInlined()) {
|
||||||
|
classType = classType.makeNullable()
|
||||||
|
}
|
||||||
annotationVisitor.visit(name, typeMapper.mapType(classType))
|
annotationVisitor.visit(name, typeMapper.mapType(classType))
|
||||||
}
|
}
|
||||||
is IrErrorExpression -> error("Don't know how to compile annotation value ${ir2string(value)}")
|
is IrErrorExpression -> error("Don't know how to compile annotation value ${ir2string(value)}")
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
+5
@@ -13987,6 +13987,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
|
|||||||
+5
@@ -13997,6 +13997,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
|
|||||||
+5
@@ -13987,6 +13987,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user