// TARGET_BACKEND: JVM_IR // WITH_STDLIB import kotlinx.serialization.* import kotlinx.serialization.json.* import kotlinx.serialization.encoding.* import kotlinx.serialization.descriptors.* @SerialInfo @Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) annotation class MyId(val id: Int, val type: String = "foo") @Serializable @MyId(10) class Foo(@MyId(20) val i: Int) fun box(): String { val desc = Foo.serializer().descriptor val classId = desc.annotations.filterIsInstance().single() val propId = desc.getElementAnnotations(0).filterIsInstance().single().id if (classId.id != 10) return "Incorrect class annotation: ${classId}" if (classId.type != "foo") return "Incorrect default argument: ${classId}" if (!classId::class.java.toString().contains("annotationImpl")) return "Backend doesn't use annotation instantiation: ${classId::class}" if (propId != 20) return "Incorrect propery annotation: $propId" val implClassJava = Class.forName("MyId\$Impl") if (implClassJava.toString() != "class MyId\$Impl") return "Old annotation implementations are not preserved for compatibility" val ctorStr = implClassJava.constructors.toList().toString() if (!ctorStr.contains("public MyId\$Impl(int,java.lang.String)")) return "Compatibility impl does not contain correct constructor: $ctorStr" val methodsStr = implClassJava.methods.toList().toString() if (!methodsStr.contains("public final int MyId\$Impl.id()")) return "Compatibility impl does not contain correct methods: $methodsStr" if (!methodsStr.contains("public final java.lang.String MyId\$Impl.type()")) return "Compatibility impl does not contain correct methods: $methodsStr" return "OK" }