Support calling experimental coroutines API in JVM
The support is very limited, though #KT-25683 Fixed
This commit is contained in:
+37
@@ -12,6 +12,8 @@ import kotlin.coroutines.experimental.EmptyCoroutineContext as ExperimentalEmpty
|
||||
import kotlin.coroutines.experimental.ContinuationInterceptor as ExperimentalContinuationInterceptor
|
||||
import kotlin.coroutines.experimental.intrinsics.COROUTINE_SUSPENDED as EXPERIMENTAL_COROUTINE_SUSPENDED
|
||||
import kotlin.coroutines.*
|
||||
import kotlin.coroutines.intrinsics.*
|
||||
|
||||
|
||||
/**
|
||||
* Converts [Continuation] to [ExperimentalContinuation].
|
||||
@@ -109,3 +111,38 @@ private class ContinuationInterceptorMigration(val interceptor: ExperimentalCont
|
||||
interceptor.interceptContinuation(continuation.toExperimentalContinuation()).toContinuation()
|
||||
}
|
||||
|
||||
internal fun <R> ((Continuation<R>) -> Any?).toExperimentalSuspendFunction(): (ExperimentalContinuation<R>) -> Any? =
|
||||
ExperimentalSuspendFunction0Migration(this)
|
||||
|
||||
internal fun <T1, R> ((T1, Continuation<R>) -> Any?).toExperimentalSuspendFunction(): (T1, ExperimentalContinuation<R>) -> Any? =
|
||||
ExperimentalSuspendFunction1Migration(this)
|
||||
|
||||
internal fun <T1, T2, R> ((T1, T2, Continuation<R>) -> Any?).toExperimentalSuspendFunction(): (T1, T2, ExperimentalContinuation<R>) -> Any? =
|
||||
ExperimentalSuspendFunction2Migration(this)
|
||||
|
||||
private class ExperimentalSuspendFunction0Migration<R>(
|
||||
val function: (Continuation<R>) -> Any?
|
||||
) : (ExperimentalContinuation<R>) -> Any? {
|
||||
override fun invoke(continuation: ExperimentalContinuation<R>): Any? {
|
||||
val result = function(continuation.toContinuation())
|
||||
return if (result === COROUTINE_SUSPENDED) EXPERIMENTAL_COROUTINE_SUSPENDED else result
|
||||
}
|
||||
}
|
||||
|
||||
private class ExperimentalSuspendFunction1Migration<T1, R>(
|
||||
val function: (T1, Continuation<R>) -> Any?
|
||||
) : (T1, ExperimentalContinuation<R>) -> Any? {
|
||||
override fun invoke(t1: T1, continuation: ExperimentalContinuation<R>): Any? {
|
||||
val result = function(t1, continuation.toContinuation())
|
||||
return if (result === COROUTINE_SUSPENDED) EXPERIMENTAL_COROUTINE_SUSPENDED else result
|
||||
}
|
||||
}
|
||||
|
||||
private class ExperimentalSuspendFunction2Migration<T1, T2, R>(
|
||||
val function: (T1, T2, Continuation<R>) -> Any?
|
||||
) : (T1, T2, ExperimentalContinuation<R>) -> Any? {
|
||||
override fun invoke(t1: T1, t2: T2, continuation: ExperimentalContinuation<R>): Any? {
|
||||
val result = function(t1, t2, continuation.toContinuation())
|
||||
return if (result === COROUTINE_SUSPENDED) EXPERIMENTAL_COROUTINE_SUSPENDED else result
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user