Generate parameters metadata for java 8 reflection

This commit is contained in:
Mikhael Bogdanov
2016-11-10 12:43:27 +01:00
parent 7721aa189f
commit 61da8be260
17 changed files with 244 additions and 1 deletions
@@ -0,0 +1,22 @@
// WITH_RUNTIME
// FULL_JDK
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
enum class A(val OK: String) {
}
fun box(): String {
val clazz = A::class.java
val constructor = clazz.getDeclaredConstructor(String::class.java, Int::class.java, String::class.java)
val parameters = constructor.getParameters()
if (parameters[0].name != "\$enum\$name") return "wrong entry name: ${parameters[0].name}"
if (!parameters[0].isSynthetic() || parameters[0].isImplicit()) return "wrong name flags: ${parameters[0].modifiers}"
if (parameters[1].name != "\$enum\$ordinal") return "wrong ordinal name: ${parameters[1].name}"
if (!parameters[1].isSynthetic() || parameters[1].isImplicit()) return "wrong ordinal flags: ${parameters[1].modifiers}"
if (parameters[2].modifiers != 0) return "wrong modifier on value parameter: ${parameters[2].modifiers}"
return parameters[2].name
}
@@ -0,0 +1,19 @@
// WITH_RUNTIME
// FULL_JDK
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
class A() {
fun String.test(OK: String) {
}
}
fun box(): String {
val clazz = A::class.java
val method = clazz.getDeclaredMethod("test", String::class.java, String::class.java)
val parameters = method.getParameters()
if (!parameters[0].isImplicit() || parameters[0].isSynthetic()) return "wrong modifier on receiver parameter: ${parameters[0].modifiers}"
return parameters[1].name
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
// FULL_JDK
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
class A() {
fun test(OK: String) {
}
}
fun box(): String {
val clazz = A::class.java
val method = clazz.getDeclaredMethod("test", String::class.java)
val parameters = method.getParameters()
if (parameters[0].modifiers != 0) return "wrong modifier on value parameter: ${parameters[0].modifiers}"
return parameters[0].name
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
// FULL_JDK
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
class A {
inner class B
}
fun box(): String {
val clazz = A.B::class.java
val constructor = clazz.getDeclaredConstructors().single()
val parameters = constructor.getParameters()
if (parameters[0].name != "this$0") return "wrong outer name: ${parameters[0].name}"
if (!parameters[0].isImplicit() || parameters[0].isSynthetic()) return "wrong outer flags: ${parameters[0].modifiers}"
return "OK"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
// FULL_JDK
// KOTLIN_CONFIGURATION_FLAGS: +JVM.PARAMETERS_METADATA
open class A(val s: String)
fun test(OK: String) = object : A(OK) {
}
fun box(): String {
val value = test("OK")
val clazz = value.javaClass
val constructor = clazz.getDeclaredConstructors().single()
val parameters = constructor.getParameters()
if (!parameters[0].isSynthetic() || parameters[0].isImplicit()) return "wrong modifier on value parameter: ${parameters[0].modifiers}"
return value.s
}