// 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.Object>", lambda.javaClass.genericInterfaces.single() ) } fun assertListFun(lambda: suspend (List) -> Unit) { assertEquals( "kotlin.jvm.functions.Function2, kotlin.coroutines.Continuation, java.lang.Object>", lambda.javaClass.genericInterfaces.single() ) } fun assertMutableListFun(lambda: suspend (MutableList) -> MutableList) { assertEquals( "kotlin.jvm.functions.Function2, kotlin.coroutines.Continuation>, java.lang.Object>", lambda.javaClass.genericInterfaces.single() ) } fun assertFunWithIn(lambda: suspend (Comparable) -> Unit) { assertEquals( "kotlin.jvm.functions.Function2, kotlin.coroutines.Continuation, java.lang.Object>", lambda.javaClass.genericInterfaces.single() ) } fun assertExtensionFun(lambda: suspend Any.() -> Unit) { assertEquals( "kotlin.jvm.functions.Function2, java.lang.Object>", lambda.javaClass.genericInterfaces.single() ) } fun assertExtensionWithArgFun(lambda: suspend Long.(x: Any) -> Date) { assertEquals( "kotlin.jvm.functions.Function3, java.lang.Object>", lambda.javaClass.genericInterfaces.single() ) } fun box(): String { assertGenericSuper("kotlin.jvm.functions.Function1, java.lang.Object>", unitFun) assertGenericSuper("kotlin.jvm.functions.Function1, java.lang.Object>", intFun) assertStringParamFun { x: String -> } assertListFun { l: List -> l } assertMutableListFun { l -> null!! } assertFunWithIn { x -> } assertExtensionFun { } assertExtensionWithArgFun { x -> Date() } return "OK" }