Refine definition of whether call is suspension point

It's not about all calls to suspend functions, they may called from non-coroutine code
This commit is contained in:
Denis Zharkov
2016-06-01 12:53:14 +03:00
parent 1067531224
commit 2bdaec6eac
6 changed files with 86 additions and 10 deletions
@@ -17,10 +17,13 @@
package org.jetbrains.kotlin.resolve.coroutine
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver
import org.jetbrains.kotlin.types.KotlinType
val SUSPENSION_POINT_KEY: FunctionDescriptor.UserDataKey<Boolean> = object : FunctionDescriptor.UserDataKey<Boolean> {}
// Returns suspension function as it's visible within coroutines:
// E.g. `fun <V> await(f: CompletableFuture<V>): V` instead of `fun <V> await(f: CompletableFuture<V>, machine: Continuation<V>): Unit`
fun SimpleFunctionDescriptor.createCoroutineSuspensionFunctionView(): SimpleFunctionDescriptor? {
@@ -37,6 +40,7 @@ fun SimpleFunctionDescriptor.createCoroutineSuspensionFunctionView(): SimpleFunc
setOriginal(newOriginal)
setValueParameters(valueParameters.subList(0, valueParameters.size - 1))
setSignatureChange()
putUserData(SUSPENSION_POINT_KEY, true)
}.build()!!
}