| // TARGET_BACKEND: JS_IR, JS_IR_ES6 |
| import kotlin.coroutines.Continuation |
| import kotlin.coroutines.EmptyCoroutineContext |
| import kotlin.coroutines.startCoroutine |
| import kotlin.test.* |
| |
| class CoroutineStub { |
| companion object { |
| fun evaluate(c: suspend () -> Unit) { |
| c.startCoroutine(object : Continuation<Unit> { |
| override val context = EmptyCoroutineContext |
| override fun resumeWith(result: Result<Unit>) { |
| result.getOrThrow() |
| } |
| }) |
| } |
| } |
| } |
| |
| fun testLabmdaParam(x: () -> Unit) { |
| assertEquals(x::class.simpleName, "Function0") |
| } |
| |
| fun testSuspendLambaParam(x: suspend () -> Unit) { |
| assertEquals(x::class.simpleName, "Function1") |
| } |
| |
| inline fun <reified T> testLabmdaParamGeneric(x: T) { |
| assertEquals(T::class.simpleName, "Function0") |
| } |
| |
| inline fun <reified T> testSuspendLambaParamGeneric(x: T) { |
| assertEquals(T::class.simpleName, "SuspendFunction0") |
| } |
| |
| fun box(): String { |
| testLabmdaParam({}) |
| testSuspendLambaParam(suspend {}) |
| testLabmdaParamGeneric({}) |
| testSuspendLambaParamGeneric(suspend {}) |
| |
| val sx = suspend { |
| val sy = suspend { |
| val sz = suspend { |
| val a = { |
| val b = { |
| val c = { |
| CoroutineStub.evaluate { |
| val x = suspend { |
| val y = suspend { |
| val z = suspend { } |
| assertEquals(z::class.simpleName, "Function1") |
| |
| assertEquals((suspend { })::class.simpleName, "Function1") |
| assertEquals(({ })::class.simpleName, "Function0") |
| } |
| y() |
| assertEquals(y::class.simpleName, "Function1") |
| } |
| x() |
| assertEquals(x::class.simpleName, "Function1") |
| } |
| } |
| c() |
| assertEquals(c::class.simpleName, "Function0") |
| } |
| b() |
| assertEquals(b::class.simpleName, "Function0") |
| } |
| a() |
| assertEquals(a::class.simpleName, "Function0") |
| } |
| sz() |
| assertEquals(sz::class.simpleName, "Function1") |
| } |
| sy() |
| assertEquals(sy::class.simpleName, "Function1") |
| } |
| assertEquals(sx::class.simpleName, "Function1") |
| CoroutineStub.evaluate(sx) |
| |
| return "OK" |
| } |