// TARGET_BACKEND: JVM // WITH_REFLECT import kotlin.reflect.KClass import kotlin.reflect.full.primaryConstructor import kotlin.test.assertEquals import kotlin.test.assertFails annotation class NoParams annotation class OneDefault(val s: String = "OK") annotation class OneNonDefault(val s: String) annotation class TwoParamsOneDefault(val s: String, val x: Int = 42) annotation class TwoParamsOneDefaultKClass(val string: String, val klass: KClass<*> = Number::class) annotation class TwoNonDefaults(val string: String, val klass: KClass<*>) inline fun create(args: Map): T { val ctor = T::class.constructors.single() return ctor.callBy(args.mapKeys { entry -> ctor.parameters.single { it.name == entry.key } }) } inline fun create(): T = create(emptyMap()) fun box(): String { create() val t1 = create() assertEquals("OK", t1.s) assertFails { create(mapOf("s" to 42)) } val t2 = create(mapOf("s" to "OK")) assertEquals("OK", t2.s) assertFails { create() } val t3 = create(mapOf("s" to "OK")) assertEquals("OK", t3.s) assertEquals(42, t3.x) val t4 = create(mapOf("s" to "OK", "x" to 239)) assertEquals(239, t4.x) assertFails { create(mapOf("s" to "Fail", "x" to "Fail")) } val t5 = create(mapOf("string" to "OK")) assertEquals(Number::class, t5.klass) assertFails("KClass (not Class) instances should be passed as arguments") { create(mapOf("klass" to String::class.java, "string" to "Fail")) } val t6 = create(mapOf("klass" to String::class, "string" to "OK")) return t6.string }