| // WITH_REFLECT |
| |
| // TARGET_BACKEND: JVM |
| |
| // FILE: JavaAnn.java |
| |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| |
| @Retention(RetentionPolicy.RUNTIME) |
| @interface JavaAnn { |
| String[] value() default {}; |
| String[] path() default {}; |
| } |
| |
| // FILE: test.kt |
| |
| import java.util.Arrays |
| import kotlin.reflect.KClass |
| import kotlin.reflect.KFunction0 |
| import kotlin.reflect.full.findAnnotation |
| |
| inline fun <reified T : Annotation> test(kFunction: KFunction0<Unit>, test: T.() -> Unit) { |
| val annotation = kFunction.findAnnotation<T>()!! |
| annotation.test() |
| } |
| |
| fun check(b: Boolean, message: String) { |
| if (!b) throw RuntimeException(message) |
| } |
| |
| annotation class Ann(vararg val s: String) |
| |
| @Ann(s = ["value1", "value2"]) |
| fun test1() {} |
| |
| @Ann(s = arrayOf("value3", "value4")) |
| fun test2() {} |
| |
| @JavaAnn(value = ["value5"], path = ["value6"]) |
| fun test3() {} |
| |
| @JavaAnn("value7", path = ["value8"]) |
| fun test4() {} |
| |
| fun box(): String { |
| test<Ann>(::test1) { |
| check(s.contentEquals(arrayOf("value1", "value2")), "Fail 1: ${s.joinToString()}") |
| } |
| |
| test<Ann>(::test2) { |
| check(s.contentEquals(arrayOf("value3", "value4")), "Fail 2: ${s.joinToString()}") |
| } |
| |
| test<JavaAnn>(::test3) { |
| check(value.contentEquals(arrayOf("value5")), "Fail 3: ${value.joinToString()}") |
| check(path.contentEquals(arrayOf("value6")), "Fail 3: ${path.joinToString()}") |
| } |
| |
| test<JavaAnn>(::test4) { |
| check(value.contentEquals(arrayOf("value7")), "Fail 4: ${value.joinToString()}") |
| check(path.contentEquals(arrayOf("value8")), "Fail 4: ${path.joinToString()}") |
| } |
| |
| return "OK" |
| } |