JVM IR: Fix suspend lambda generic signatures
This commit is contained in:
committed by
Ilmir Usmanov
parent
e6efb81014
commit
272f6abe69
Vendored
+73
@@ -0,0 +1,73 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_RUNTIME
|
||||
|
||||
import java.util.Date
|
||||
|
||||
fun assertEquals(expected: String, actual: Any) {
|
||||
if ("$actual" != expected)
|
||||
throw AssertionError("Fail, expected: $expected, actual: $actual")
|
||||
}
|
||||
|
||||
fun assertGenericSuper(expected: String, function: Any?) {
|
||||
val clazz = (function as java.lang.Object).getClass()!!
|
||||
val genericSuper = clazz.getGenericInterfaces()[0]!!
|
||||
assertEquals(expected, genericSuper)
|
||||
}
|
||||
|
||||
val unitFun = suspend { }
|
||||
val intFun = suspend { 42 }
|
||||
|
||||
fun assertStringParamFun(lambda: suspend (String) -> Unit) {
|
||||
assertEquals(
|
||||
"kotlin.jvm.functions.Function2<java.lang.String, kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>",
|
||||
lambda.javaClass.genericInterfaces.single()
|
||||
)
|
||||
}
|
||||
|
||||
fun assertListFun(lambda: suspend (List<String>) -> Unit) {
|
||||
assertEquals(
|
||||
"kotlin.jvm.functions.Function2<java.util.List<? extends java.lang.String>, kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>",
|
||||
lambda.javaClass.genericInterfaces.single()
|
||||
)
|
||||
}
|
||||
|
||||
fun assertMutableListFun(lambda: suspend (MutableList<Double>) -> MutableList<Int>) {
|
||||
assertEquals(
|
||||
"kotlin.jvm.functions.Function2<java.util.List<java.lang.Double>, kotlin.coroutines.Continuation<? super java.util.List<java.lang.Integer>>, java.lang.Object>",
|
||||
lambda.javaClass.genericInterfaces.single()
|
||||
)
|
||||
}
|
||||
|
||||
fun assertFunWithIn(lambda: suspend (Comparable<String>) -> Unit) {
|
||||
assertEquals(
|
||||
"kotlin.jvm.functions.Function2<java.lang.Comparable<? super java.lang.String>, kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>",
|
||||
lambda.javaClass.genericInterfaces.single()
|
||||
)
|
||||
}
|
||||
|
||||
fun assertExtensionFun(lambda: suspend Any.() -> Unit) {
|
||||
assertEquals(
|
||||
"kotlin.jvm.functions.Function2<java.lang.Object, kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>",
|
||||
lambda.javaClass.genericInterfaces.single()
|
||||
)
|
||||
}
|
||||
|
||||
fun assertExtensionWithArgFun(lambda: suspend Long.(x: Any) -> Date) {
|
||||
assertEquals(
|
||||
"kotlin.jvm.functions.Function3<java.lang.Long, java.lang.Object, kotlin.coroutines.Continuation<? super java.util.Date>, java.lang.Object>",
|
||||
lambda.javaClass.genericInterfaces.single()
|
||||
)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertGenericSuper("kotlin.jvm.functions.Function1<kotlin.coroutines.Continuation<? super kotlin.Unit>, java.lang.Object>", unitFun)
|
||||
assertGenericSuper("kotlin.jvm.functions.Function1<kotlin.coroutines.Continuation<? super java.lang.Integer>, java.lang.Object>", intFun)
|
||||
assertStringParamFun { x: String -> }
|
||||
assertListFun { l: List<String> -> l }
|
||||
assertMutableListFun { l -> null!! }
|
||||
assertFunWithIn { x -> }
|
||||
assertExtensionFun { }
|
||||
assertExtensionWithArgFun { x -> Date() }
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user