Reflection: add KTypeProjection and KType.arguments
#KT-8998 In Progress
This commit is contained in:
+34
@@ -0,0 +1,34 @@
|
||||
// WITH_REFLECT
|
||||
// FULL_JDK
|
||||
|
||||
import java.lang.reflect.ParameterizedType
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
class Bar
|
||||
fun arrayOfInvBar(): Array<Bar> = null!!
|
||||
fun arrayOfInBar(): Array<in Bar> = null!!
|
||||
fun arrayOfOutBar(): Array<out Bar> = null!!
|
||||
|
||||
fun arrayOfInvList(): Array<List<String>> = null!!
|
||||
fun arrayOfInList(): Array<in List<String>> = null!!
|
||||
fun arrayOfOutList(): Array<out List<String>> = null!!
|
||||
|
||||
fun box(): String {
|
||||
// NB: in "Array<in X>", Java type of X is always Any::class.java because this is the JVM signature generated by the compiler
|
||||
|
||||
assertEquals(Bar::class.java, ::arrayOfInvBar.returnType.arguments.single().type!!.javaType)
|
||||
assertEquals(Any::class.java, ::arrayOfInBar.returnType.arguments.single().type!!.javaType)
|
||||
assertEquals(Bar::class.java, ::arrayOfOutBar.returnType.arguments.single().type!!.javaType)
|
||||
|
||||
val invList = ::arrayOfInvList.returnType.arguments.single().type!!.javaType
|
||||
assertTrue(invList is ParameterizedType && invList.rawType == List::class.java, invList.toString())
|
||||
|
||||
assertEquals(Any::class.java, ::arrayOfInList.returnType.arguments.single().type!!.javaType)
|
||||
|
||||
val outList = ::arrayOfOutList.returnType.arguments.single().type!!.javaType
|
||||
assertTrue(outList is ParameterizedType && outList.rawType == List::class.java, outList.toString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun listOfStrings(): List<String> = null!!
|
||||
|
||||
class Foo<T>
|
||||
class Bar
|
||||
fun fooOfInvBar(): Foo<Bar> = null!!
|
||||
fun fooOfInBar(): Foo<in Bar> = null!!
|
||||
fun fooOfOutBar(): Foo<out Bar> = null!!
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(String::class.java, ::listOfStrings.returnType.arguments.single().type!!.javaType)
|
||||
|
||||
assertEquals(Bar::class.java, ::fooOfInvBar.returnType.arguments.single().type!!.javaType)
|
||||
assertEquals(Bar::class.java, ::fooOfInBar.returnType.arguments.single().type!!.javaType)
|
||||
assertEquals(Bar::class.java, ::fooOfOutBar.returnType.arguments.single().type!!.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// WITH_REFLECT
|
||||
// FILE: J.java
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface J {
|
||||
List foo();
|
||||
}
|
||||
|
||||
// FILE: K.kt
|
||||
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(Any::class.java, J::foo.returnType.arguments.single().type!!.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user