Support mapping of KType to j.l.reflect.Type
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
// FULL_JDK
|
||||
|
||||
import java.lang.reflect.GenericArrayType
|
||||
import java.lang.reflect.TypeVariable
|
||||
import java.lang.reflect.ParameterizedType
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun foo(strings: Array<String>, integers: Array<Int>, objectArrays: Array<Array<Any>>) {}
|
||||
|
||||
fun bar(): Array<List<String>> = null!!
|
||||
class A<T> {
|
||||
fun baz(): Array<T> = null!!
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(javaClass<Array<String>>(), ::foo.parameters[0].type.javaType)
|
||||
assertEquals(javaClass<Array<Int>>(), ::foo.parameters[1].type.javaType)
|
||||
assertEquals(javaClass<Array<Array<Any>>>(), ::foo.parameters[2].type.javaType)
|
||||
|
||||
val g = ::bar.returnType.javaType
|
||||
if (g !is GenericArrayType || g.genericComponentType !is ParameterizedType)
|
||||
return "Fail: should be array of parameterized type, but was $g (${g.javaClass})"
|
||||
|
||||
val h = A<String>::baz.returnType.javaType
|
||||
if (h !is GenericArrayType || h.genericComponentType !is TypeVariable<*>)
|
||||
return "Fail: should be array of type variable, but was $h (${h.javaClass})"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A(d: Double, s: String, parent: A?) {
|
||||
class Nested(a: A)
|
||||
inner class Inner(nested: Nested)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(listOf(java.lang.Double.TYPE, javaClass<String>(), javaClass<A>()), ::A.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(javaClass<A>()), A::Nested.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(javaClass<A>(), javaClass<A.Nested>()), A::Inner.parameters.map { it.type.javaType })
|
||||
|
||||
assertEquals(javaClass<A>(), ::A.returnType.javaType)
|
||||
assertEquals(javaClass<A.Nested>(), A::Nested.returnType.javaType)
|
||||
assertEquals(javaClass<A.Inner>(), A::Inner.returnType.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
import kotlin.platform.platformStatic as static
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A {
|
||||
fun foo(t: Long?): Long = t!!
|
||||
}
|
||||
|
||||
object O {
|
||||
static fun bar(a: A): String = ""
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(listOf(javaClass<A>(), javaClass<java.lang.Long>()), A::foo.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(javaClass<O>(), javaClass<A>()), O::bar.parameters.map { it.type.javaType })
|
||||
|
||||
assertEquals(java.lang.Long.TYPE, A::foo.returnType.javaType)
|
||||
assertEquals(javaClass<String>(), O::bar.returnType.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.*
|
||||
|
||||
interface I {
|
||||
fun foo(): Any
|
||||
}
|
||||
|
||||
class A : I {
|
||||
override fun foo(): Int = 0
|
||||
fun bar(x: Long): Int = x.toInt()
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(javaClass<Integer>(), A::foo.returnType.javaType)
|
||||
assertNotEquals(Integer.TYPE, A::foo.returnType.javaType)
|
||||
|
||||
assertNotEquals(javaClass<Integer>(), A::bar.returnType.javaType)
|
||||
assertEquals(Integer.TYPE, A::bar.returnType.javaType)
|
||||
|
||||
assertEquals(java.lang.Long.TYPE, A::bar.parameters.last().type.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
// FULL_JDK
|
||||
|
||||
import java.lang.reflect.ParameterizedType
|
||||
import kotlin.platform.platformStatic as static
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A(private var foo: List<String>)
|
||||
|
||||
object O {
|
||||
private static var bar: List<String> = listOf()
|
||||
}
|
||||
|
||||
fun topLevel(): List<String> = listOf()
|
||||
fun Any.extension(): List<String> = listOf()
|
||||
|
||||
fun assertGenericType(type: KType) {
|
||||
val javaType = type.javaType
|
||||
if (javaType !is ParameterizedType) {
|
||||
throw AssertionError("Type should be a parameterized type, but was $javaType (${javaType.javaClass})")
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = A::class.members.single { it.name == "foo" } as KMutableProperty<*>
|
||||
assertGenericType(foo.returnType)
|
||||
assertGenericType(foo.getter.returnType)
|
||||
assertGenericType(foo.setter.parameters.last().type)
|
||||
|
||||
val bar = O::class.members.single { it.name == "bar" } as KMutableProperty<*>
|
||||
assertGenericType(bar.returnType)
|
||||
assertGenericType(bar.getter.returnType)
|
||||
assertGenericType(bar.setter.parameters.last().type)
|
||||
|
||||
assertGenericType(::topLevel.returnType)
|
||||
assertGenericType(Any::extension.returnType)
|
||||
assertGenericType(::A.parameters.single().type)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
import kotlin.platform.platformStatic as static
|
||||
import kotlin.reflect.KMutableProperty
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A(private var foo: String)
|
||||
|
||||
object O {
|
||||
private static var bar: String = ""
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = A::class.members.single { it.name == "foo" } as KMutableProperty<*>
|
||||
assertEquals(listOf(javaClass<A>()), foo.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(javaClass<A>()), foo.getter.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(javaClass<A>(), javaClass<String>()), foo.setter.parameters.map { it.type.javaType })
|
||||
|
||||
val bar = O::class.members.single { it.name == "bar" } as KMutableProperty<*>
|
||||
assertEquals(listOf(javaClass<O>()), bar.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(javaClass<O>()), bar.getter.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(javaClass<O>(), javaClass<String>()), bar.setter.parameters.map { it.type.javaType })
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun free(s: String): Int = s.length()
|
||||
|
||||
fun Any.extension() {}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(java.lang.Integer.TYPE, ::free.returnType.javaType)
|
||||
assertEquals(javaClass<String>(), ::free.parameters.single().type.javaType)
|
||||
|
||||
assertEquals(javaClass<Any>(), Any::extension.parameters.single().type.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
// FULL_JDK
|
||||
|
||||
import java.lang.reflect.TypeVariable
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A<T> {
|
||||
fun foo(t: T) {}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val f = A<String>::foo
|
||||
val t = f.parameters.last().type.javaType
|
||||
if (t !is TypeVariable<*>) return "Fail, t should be a type variable: $t"
|
||||
|
||||
assertEquals("T", t.name)
|
||||
assertEquals("A", (t.genericDeclaration as Class<*>).name)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun foo(unitParam: Unit, nullableUnitParam: Unit?): Unit {}
|
||||
|
||||
var bar: Unit = Unit
|
||||
|
||||
fun box(): String {
|
||||
assert(javaClass<Unit>() != java.lang.Void.TYPE)
|
||||
|
||||
assertEquals(javaClass<Unit>(), ::foo.parameters[0].type.javaType)
|
||||
assertEquals(javaClass<Unit>(), ::foo.parameters[1].type.javaType)
|
||||
assertEquals(java.lang.Void.TYPE, ::foo.returnType.javaType)
|
||||
|
||||
assertEquals(javaClass<Unit>(), ::bar.returnType.javaType)
|
||||
assertEquals(javaClass<Unit>(), ::bar.getter.returnType.javaType)
|
||||
assertEquals(javaClass<Unit>(), ::bar.setter.parameters.single().type.javaType)
|
||||
assertEquals(java.lang.Void.TYPE, ::bar.setter.returnType.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user