blob: bda09f55655c65d55c6826ac64369bd8729bc796 [file] [log] [blame]
// 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<MyId>().single()
val propId = desc.getElementAnnotations(0).filterIsInstance<MyId>().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"
}