Get rid of unnecessary additional declarations in tests

This commit is contained in:
Denis Zharkov
2017-01-14 13:12:21 +03:00
parent 2dfcb490a5
commit 6a1ad3a279
13 changed files with 70 additions and 47 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ class AsyncGeneratorIterator<T>: AsyncIterator<T>, AsyncGenerator<T>, Continuati
var computesNext = false
var computeContinuation: Continuation<*>? = null
override val context = EmptyContext
override val context = EmptyCoroutineContext
suspend fun computeHasNext(): Boolean = suspendCoroutineOrReturn { c ->
computesNext = false
@@ -9,7 +9,7 @@ fun builder(c: suspend () -> Unit) {
var exception: Throwable? = null
c.createCoroutine(object : Continuation<Unit> {
override val context = EmptyContext
override val context = EmptyCoroutineContext
override fun resume(data: Unit) {
}
@@ -24,7 +24,7 @@ class Controller {
fun builder(c: suspend Controller.() -> Unit): String {
val controller = Controller()
c.startCoroutine(controller, object : Continuation<Unit> {
override val context = EmptyContext
override val context = EmptyCoroutineContext
override fun resume(data: Unit) {
@@ -17,7 +17,7 @@ class Controller {
fun builder(c: suspend Controller.() -> Unit): String {
val controller = Controller()
c.startCoroutine(controller, object : Continuation<Unit> {
override val context = EmptyContext
override val context = EmptyCoroutineContext
override fun resume(data: Unit) {}
@@ -21,6 +21,34 @@ class Controller {
}
}
abstract class ContinuationDispatcher : ContinuationInterceptor {
override val contextKey: CoroutineContextKey<*> = ContinuationInterceptor
abstract fun <T> dispatchResume(value: T, continuation: Continuation<T>): Boolean
abstract fun dispatchResumeWithException(exception: Throwable, continuation: Continuation<*>): Boolean
override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> = DispatchedContinuation(this, continuation)
override operator fun <E : CoroutineContextElement> get(key: CoroutineContextKey<E>): E? = if (this.contextKey == key) this as E else null
override fun <R> fold(initial: R, operation: (R, CoroutineContextElement) -> R): R = operation(initial, this)
override operator fun plus(context: CoroutineContext): CoroutineContext = this
override fun minusKey(key: CoroutineContextKey<*>): CoroutineContext = if (this.contextKey == key) EmptyCoroutineContext else this
}
private class DispatchedContinuation<T>(
val dispatcher: ContinuationDispatcher,
val continuation: Continuation<T>
): Continuation<T> {
override val context: CoroutineContext = continuation.context
override fun resume(value: T) {
if (!dispatcher.dispatchResume(value, continuation))
continuation.resume(value)
}
override fun resumeWithException(exception: Throwable) {
if (!dispatcher.dispatchResumeWithException(exception, continuation))
continuation.resumeWithException(exception)
}
}
fun test(c: suspend Controller.() -> Unit): String {
val controller = Controller()
c.startCoroutine(controller, EmptyContinuation(object: ContinuationDispatcher() {
+1 -1
View File
@@ -39,7 +39,7 @@ class GeneratedSequence<out T>(private val block: suspend Generator<T>.() -> Uni
class GeneratedIterator<T>(block: suspend Generator<T>.() -> Unit) : AbstractIterator<T>(), Generator<T> {
private var nextStep: Continuation<Unit> = block.createCoroutine(this, object : Continuation<Unit> {
override val context = EmptyContext
override val context = EmptyCoroutineContext
override fun resume(data: Unit) {
done()
@@ -15,7 +15,7 @@ var result = ""
fun builder(c: suspend () -> Unit) {
c.startCoroutine(object : Continuation<Unit> {
override val context = EmptyContext
override val context = EmptyCoroutineContext
override fun resume(value: Unit) {
}
override fun resumeWithException(exception: Throwable) {
@@ -12,7 +12,7 @@ fun builder(c: suspend () -> Int): Int {
var res = 0
c.createCoroutine(object : Continuation<Int> {
override val context = EmptyContext
override val context = EmptyCoroutineContext
override fun resume(data: Int) {
res = data
@@ -21,6 +21,34 @@ class Controller {
}
}
abstract class ContinuationDispatcher : ContinuationInterceptor {
override val contextKey: CoroutineContextKey<*> = ContinuationInterceptor
abstract fun <T> dispatchResume(value: T, continuation: Continuation<T>): Boolean
abstract fun dispatchResumeWithException(exception: Throwable, continuation: Continuation<*>): Boolean
override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> = DispatchedContinuation(this, continuation)
override operator fun <E : CoroutineContextElement> get(key: CoroutineContextKey<E>): E? = if (this.contextKey == key) this as E else null
override fun <R> fold(initial: R, operation: (R, CoroutineContextElement) -> R): R = operation(initial, this)
override operator fun plus(context: CoroutineContext): CoroutineContext = this
override fun minusKey(key: CoroutineContextKey<*>): CoroutineContext = if (this.contextKey == key) EmptyCoroutineContext else this
}
private class DispatchedContinuation<T>(
val dispatcher: ContinuationDispatcher,
val continuation: Continuation<T>
): Continuation<T> {
override val context: CoroutineContext = continuation.context
override fun resume(value: T) {
if (!dispatcher.dispatchResume(value, continuation))
continuation.resume(value)
}
override fun resumeWithException(exception: Throwable) {
if (!dispatcher.dispatchResumeWithException(exception, continuation))
continuation.resumeWithException(exception)
}
}
fun test(c: suspend Controller.() -> Unit): String {
val controller = Controller()
c.startCoroutine(controller, EmptyContinuation(object: ContinuationDispatcher() {
@@ -11,7 +11,7 @@ suspend fun suspendHere(): String = suspendCoroutineOrReturn { x ->
fun builder(c: suspend () -> Unit) {
var wasResumeCalled = false
c.startCoroutine(object : Continuation<Unit> {
override val context = EmptyContext
override val context = EmptyCoroutineContext
override fun resume(value: Unit) {
wasResumeCalled = true
@@ -11,7 +11,7 @@ suspend fun suspendHere(): String = suspendCoroutineOrReturn { x ->
fun builder(c: suspend () -> Unit) {
var wasResumeCalled = false
c.startCoroutine(object : Continuation<Unit> {
override val context = EmptyContext
override val context = EmptyCoroutineContext
override fun resume(value: Unit) {
wasResumeCalled = true