From 819ffe711713c9d54285777de969ed34f9b1bf1e Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Fri, 20 Jul 2018 10:28:24 +0300 Subject: [PATCH] Remove suspending function migration adapters for 1.3-M1 --- .../migration/CoroutinesMigration.kt | 76 ----------------- .../jvm/test/CoroutinesMigrationTest.kt | 84 ------------------- 2 files changed, 160 deletions(-) diff --git a/libraries/stdlib/coroutines/jvm/src/kotlin/coroutines/experimental/migration/CoroutinesMigration.kt b/libraries/stdlib/coroutines/jvm/src/kotlin/coroutines/experimental/migration/CoroutinesMigration.kt index e4aa1faf525..2b60ecd2bea 100644 --- a/libraries/stdlib/coroutines/jvm/src/kotlin/coroutines/experimental/migration/CoroutinesMigration.kt +++ b/libraries/stdlib/coroutines/jvm/src/kotlin/coroutines/experimental/migration/CoroutinesMigration.kt @@ -12,54 +12,6 @@ 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.* - - -/** - * Adapter to invoke experimental suspending function. - * - * To invoke experimental suspending function `foo(args)` that returns value of some type `Result` - * from Kotlin 1.3 use the following code: - * - * ``` - * invokeExperimentalSuspend { foo(args, it) } - * ``` - */ -@SinceKotlin("1.3") -public suspend inline fun invokeExperimentalSuspend(crossinline invocation: (ExperimentalContinuation) -> Any?): T = - suspendCoroutineUninterceptedOrReturn { continuation -> - val result = invocation(continuation.toExperimentalContinuation()) - @Suppress("UNCHECKED_CAST") - if (result === EXPERIMENTAL_COROUTINE_SUSPENDED) COROUTINE_SUSPENDED else result as T - } - -/** - * Coverts reference to suspending function to experimental suspending function. - */ -@SinceKotlin("1.3") -public fun (suspend () -> T).toExperimentalSuspendFunction(): (ExperimentalContinuation) -> Any? = - ExperimentalSuspendFunction0Migration(this) - -/** - * Coverts reference to experimental suspending function to suspending function. - */ -@SinceKotlin("1.3") -public fun ((ExperimentalContinuation) -> Any?).toSuspendFunction(): suspend () -> T = - (this as? ExperimentalSuspendFunction0Migration)?.function ?: SuspendFunction0Migration(this)::invoke - -/** - * Coverts reference to suspending function with receiver to experimental suspending function. - */ -@SinceKotlin("1.3") -public fun (suspend (R) -> T).toExperimentalSuspendFunction(): (R, ExperimentalContinuation) -> Any? = - ExperimentalSuspendFunction1Migration(this) - -/** - * Coverts reference to experimental suspending function with receiver to suspending function. - */ -@SinceKotlin("1.3") -public fun ((R, ExperimentalContinuation) -> Any?).toSuspendFunction(): suspend (R) -> T = - (this as? ExperimentalSuspendFunction1Migration)?.function ?: SuspendFunction1Migration(this)::invoke /** * Converts [Continuation] to [ExperimentalContinuation]. @@ -118,34 +70,6 @@ public fun ExperimentalContinuationInterceptor.toContinuationInterceptor(): Cont // ------------------ converter classes ------------------ // Their name starts with "Experimental" if they implement the corresponding Experimental interfaces -private class ExperimentalSuspendFunction0Migration(val function: suspend () -> T) : (ExperimentalContinuation) -> Any? { - override fun invoke(continuation: ExperimentalContinuation): Any? { - val result = function.startCoroutineUninterceptedOrReturn(continuation.toContinuation()) - return if (result === COROUTINE_SUSPENDED) EXPERIMENTAL_COROUTINE_SUSPENDED else result - } -} - -private class SuspendFunction0Migration(val function: (ExperimentalContinuation) -> Any?) { - suspend fun invoke(): T = suspendCoroutineUninterceptedOrReturn { continuation -> - val result = function(continuation.toExperimentalContinuation()) - if (result === EXPERIMENTAL_COROUTINE_SUSPENDED) COROUTINE_SUSPENDED else result - } -} - -private class ExperimentalSuspendFunction1Migration(val function: suspend (R) -> T) : (R, ExperimentalContinuation) -> Any? { - override fun invoke(receiver: R, continuation: ExperimentalContinuation): Any? { - val result = function.startCoroutineUninterceptedOrReturn(receiver, continuation.toContinuation()) - return if (result === COROUTINE_SUSPENDED) EXPERIMENTAL_COROUTINE_SUSPENDED else result - } -} - -private class SuspendFunction1Migration(val function: (R, ExperimentalContinuation) -> Any?) { - suspend fun invoke(receiver: R): T = suspendCoroutineUninterceptedOrReturn { continuation -> - val result = function(receiver, continuation.toExperimentalContinuation()) - if (result === EXPERIMENTAL_COROUTINE_SUSPENDED) COROUTINE_SUSPENDED else result - } -} - private class ExperimentalContinuationMigration(val continuation: Continuation): ExperimentalContinuation { override val context = continuation.context.toExperimentalCoroutineContext() override fun resume(value: T) = continuation.resume(value) diff --git a/libraries/stdlib/coroutines/jvm/test/CoroutinesMigrationTest.kt b/libraries/stdlib/coroutines/jvm/test/CoroutinesMigrationTest.kt index 798fa17d341..99886f12785 100644 --- a/libraries/stdlib/coroutines/jvm/test/CoroutinesMigrationTest.kt +++ b/libraries/stdlib/coroutines/jvm/test/CoroutinesMigrationTest.kt @@ -7,8 +7,6 @@ package test.kotlin.coroutines.experimental.migration -import test.kotlin.coroutines.TestDispatcher -import java.util.concurrent.Semaphore import kotlin.coroutines.experimental.buildSequence as experimentalBuildSequence import kotlin.coroutines.experimental.SequenceBuilder as ExperimentalSequenceBuilder import kotlin.coroutines.experimental.Continuation as ExperimentalContinuation @@ -19,8 +17,6 @@ import kotlin.coroutines.experimental.ContinuationInterceptor as ExperimentalCon import kotlin.coroutines.experimental.intrinsics.COROUTINE_SUSPENDED as EXPERIMENTAL_COROUTINE_SUSPENDED import kotlin.coroutines.experimental.migration.* import kotlin.coroutines.* -import kotlin.coroutines.experimental.startCoroutine -import kotlin.coroutines.jvm.internal.runSuspend import kotlin.test.* /** @@ -47,86 +43,6 @@ class CoroutinesMigrationTest { } } - @Test - fun testFunctionMigration() { - var fooCnt = 0 - suspend fun foo() { - fooCnt++ - } - runSuspend { - foo() - } - assertEquals(1, fooCnt) - val foo2 = ::foo.toExperimentalSuspendFunction().toSuspendFunction() - runSuspend { - foo2() - } - assertEquals(2, fooCnt) - var barCnt = 0 - suspend fun bar(x: Int) { - barCnt += x - } - runSuspend { - bar(2) - } - assertEquals(2, barCnt) - val bar2 = ::bar.toExperimentalSuspendFunction().toSuspendFunction() - runSuspend { - bar2(3) - } - assertEquals(5, barCnt) - } - - @Test - fun testInvokeExperimental0() { - testInvokeExperimentalImpl(false) - } - - @Test - fun testInvokeExperimental1() { - testInvokeExperimentalImpl(true) - } - - private fun testInvokeExperimentalImpl(shallSuspend: Boolean) { - TestDispatcher("testInvokeExperimental").use { dispatcher -> - val semaphore = Semaphore(0) - val foo: suspend (Int) -> String = { - dispatcher.assertThread() - if (shallSuspend) { - dispatcher.yield() - } - "OK$it" - } - val fooExp = foo.toExperimentalSuspendFunction() - val testCode: suspend () -> String = { - dispatcher.assertThread() - val result = invokeExperimentalSuspend { - fooExp(42, it) - } - assertEquals("OK42", result) - dispatcher.assertThread() - "DONE" - } - testCode.startCoroutine(Continuation(dispatcher) { result -> - dispatcher.assertThread() - assertEquals("DONE", result.getOrThrow()) - semaphore.release() - }) - semaphore.acquire() - } - } - - @Test - fun testExperimentalBuildSequence() { - suspend fun action(builder: ExperimentalSequenceBuilder) { - invokeExperimentalSuspend { builder.yield(1, it) } - invokeExperimentalSuspend { builder.yield(2, it) } - invokeExperimentalSuspend { builder.yield(3, it) } - } - val seq = experimentalBuildSequence(::action.toExperimentalSuspendFunction()) - assertEquals(listOf(1, 2, 3), seq.toList()) - } - class MyElement : AbstractCoroutineContextElement(Key) { companion object Key : CoroutineContext.Key }