[KJS FE] Allow using typeOf with non-reified type parameters
#KT-38771 fixed
This commit is contained in:
Vendored
+10
-3
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
@@ -16,7 +16,14 @@ fun <X> test() = typeOf<Container<X>>()
|
||||
fun box(): String {
|
||||
val type = test<Any>()
|
||||
val x = type.arguments.single().type!!.classifier as KTypeParameter
|
||||
assertEquals("kotlin.Any?", x.upperBounds.joinToString())
|
||||
|
||||
val expected = className("kotlin", "Any?")
|
||||
assertEquals(expected, x.upperBounds.joinToString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
fun className(qualifier: String, name: String): String {
|
||||
val isJS = 1 as Any is Double
|
||||
return if (isJS) name else "$qualifier.$name"
|
||||
}
|
||||
|
||||
Vendored
+8
-3
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
@@ -36,7 +36,12 @@ fun box(): String {
|
||||
assertEquals(c.x1, c.x2)
|
||||
assertEquals(c.x1.hashCode(), c.x2.hashCode())
|
||||
|
||||
assertNotEquals(c.x1, c.xFun)
|
||||
|
||||
if (!isJS) {
|
||||
assertNotEquals(c.x1, c.xFun)
|
||||
}
|
||||
assertNotEquals(c.x1, c.y)
|
||||
return "OK"
|
||||
}
|
||||
|
||||
val isJS = 1 as Any is Double
|
||||
|
||||
+7
-3
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
@@ -22,6 +22,10 @@ fun box(): String {
|
||||
assertEquals(createX<Any>(), createX<Any>())
|
||||
assertEquals(createX<Any>().hashCode(), createX<Any>().hashCode())
|
||||
|
||||
assertNotEquals(createX<Any>(), createOtherX<Any>())
|
||||
if (!isJS) {
|
||||
assertNotEquals(createX<Any>(), createOtherX<Any>())
|
||||
}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
val isJS = 1 as Any is Double
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
|
||||
Vendored
+10
-4
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
@@ -16,7 +16,13 @@ class C<X> {
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals("test.Container<X>", C<Any>().notNull().toString())
|
||||
assertEquals("test.Container<X?>", C<Any>().nullable().toString())
|
||||
val fqn = className("test", "Container")
|
||||
assertEquals("$fqn<X>", C<Any>().notNull().toString())
|
||||
assertEquals("$fqn<X?>", C<Any>().nullable().toString())
|
||||
return "OK"
|
||||
}
|
||||
|
||||
fun className(qualifier: String, name: String): String {
|
||||
val isJS = 1 as Any is Double
|
||||
return if (isJS) name else "$qualifier.$name"
|
||||
}
|
||||
|
||||
Vendored
+10
-4
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
@@ -14,7 +14,13 @@ fun <X1> notNull() = typeOf<Container<X1>>()
|
||||
fun <X2> nullable() = typeOf<Container<X2?>>()
|
||||
|
||||
fun box(): String {
|
||||
assertEquals("test.Container<X1>", notNull<Any>().toString())
|
||||
assertEquals("test.Container<X2?>", nullable<Any>().toString())
|
||||
val fqn = className("test", "Container")
|
||||
assertEquals("$fqn<X1>", notNull<Any>().toString())
|
||||
assertEquals("$fqn<X2?>", nullable<Any>().toString())
|
||||
return "OK"
|
||||
}
|
||||
|
||||
fun className(qualifier: String, name: String): String {
|
||||
val isJS = 1 as Any is Double
|
||||
return if (isJS) name else "$qualifier.$name"
|
||||
}
|
||||
|
||||
Vendored
+10
-4
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
@@ -14,7 +14,13 @@ val <X1> X1.notNull get() = typeOf<Container<X1>>()
|
||||
val <X2> X2.nullable get() = typeOf<Container<X2?>>()
|
||||
|
||||
fun box(): String {
|
||||
assertEquals("test.Container<X1>", "".notNull.toString())
|
||||
assertEquals("test.Container<X2?>", "".nullable.toString())
|
||||
val fqn = className("test", "Container")
|
||||
assertEquals("$fqn<X1>", "".notNull.toString())
|
||||
assertEquals("$fqn<X2?>", "".nullable.toString())
|
||||
return "OK"
|
||||
}
|
||||
|
||||
fun className(qualifier: String, name: String): String {
|
||||
val isJS = 1 as Any is Double
|
||||
return if (isJS) name else "$qualifier.$name"
|
||||
}
|
||||
|
||||
Vendored
+16
-10
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
@@ -25,16 +25,22 @@ fun box(): String {
|
||||
assertEquals(KVariance.OUT, c.getOut().variance)
|
||||
assertEquals(false, c.getInv().isReified)
|
||||
|
||||
val y = getY<Any, Any>()
|
||||
assertEquals(false, y.isReified)
|
||||
val x = y.upperBounds.single().classifier as KTypeParameter
|
||||
assertEquals(true, x.isReified)
|
||||
assertEquals(KVariance.INVARIANT, x.variance)
|
||||
if (!isJS) {
|
||||
val y = getY<Any, Any>()
|
||||
assertEquals(false, y.isReified)
|
||||
val x = y.upperBounds.single().classifier as KTypeParameter
|
||||
assertEquals(true, x.isReified)
|
||||
assertEquals(KVariance.INVARIANT, x.variance)
|
||||
assertEquals("X", x.toString())
|
||||
}
|
||||
|
||||
assertEquals("INV", c.getInv().toString())
|
||||
assertEquals("in IN", c.getIn().toString())
|
||||
assertEquals("out OUT", c.getOut().toString())
|
||||
assertEquals("X", x.toString())
|
||||
if (!isJS) {
|
||||
assertEquals("in IN", c.getIn().toString())
|
||||
assertEquals("out OUT", c.getOut().toString())
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
val isJS = 1 as Any is Double
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
|
||||
+14
-5
@@ -1,7 +1,7 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.ExperimentalStdlibApi
|
||||
// IGNORE_BACKEND: JS, JS_IR, NATIVE
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// WITH_REFLECT
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
|
||||
package test
|
||||
|
||||
@@ -16,16 +16,25 @@ fun <X, Y, Z> test() where X : Y?, Y : List<Z>, Z : Set<String>
|
||||
|
||||
fun box(): String {
|
||||
val type = test<MutableList<Set<String>>?, MutableList<Set<String>>, Set<String>>()
|
||||
assertEquals("test.Container<X>", type.toString())
|
||||
val containerNmae = className("test", "Container")
|
||||
assertEquals("$containerNmae<X>", type.toString())
|
||||
|
||||
val x = type.arguments.single().type!!.classifier as KTypeParameter
|
||||
assertEquals("Y?", x.upperBounds.joinToString())
|
||||
|
||||
val y = x.upperBounds.single().classifier as KTypeParameter
|
||||
assertEquals("kotlin.collections.List<Z>", y.upperBounds.joinToString())
|
||||
val listName = className("kotlin.collections", "List")
|
||||
assertEquals("$listName<Z>", y.upperBounds.joinToString())
|
||||
|
||||
val z = y.upperBounds.single().arguments.single().type!!.classifier as KTypeParameter
|
||||
assertEquals("kotlin.collections.Set<kotlin.String>", z.upperBounds.joinToString())
|
||||
val setName = className("kotlin.collections", "Set")
|
||||
val stringName = className("kotlin", "String")
|
||||
assertEquals("$setName<$stringName>", z.upperBounds.joinToString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
fun className(qualifier: String, name: String): String {
|
||||
val isJS = 1 as Any is Double
|
||||
return if (isJS) name else "$qualifier.$name"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user