[KJS FE] Allow using typeOf with non-reified type parameters

#KT-38771 fixed
This commit is contained in:
Zalim Bashorov
2020-07-08 16:20:23 +03:00
parent 9d362875da
commit ca37c6bfe6
15 changed files with 92 additions and 109 deletions
@@ -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"
}
@@ -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
@@ -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
@@ -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
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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
@@ -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
@@ -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"
}