Minor. Make extension's receiver to be a type parameter and simplify usage

This commit is contained in:
Denis Zharkov
2016-07-05 15:00:16 +03:00
parent 3445fe0d30
commit 30b4dfa65d
2 changed files with 6 additions and 7 deletions
@@ -120,11 +120,8 @@ internal class ReceiverScopeTowerLevel(
if (dispatchReceiver is CoroutineReceiverValue) { if (dispatchReceiver is CoroutineReceiverValue) {
result.addAll(result.mapNotNull { result.addAll(result.mapNotNull {
val realDescriptor = it.descriptor val suspensionFunctionView = it.descriptor.createCoroutineSuspensionFunctionView() ?: return@mapNotNull null
val suspensionFunctionView = createCandidateDescriptor(suspensionFunctionView, dispatchReceiver)
(realDescriptor as? SimpleFunctionDescriptor)?.createCoroutineSuspensionFunctionView() ?: return@mapNotNull null
@Suppress("UNCHECKED_CAST")
createCandidateDescriptor(suspensionFunctionView as D, dispatchReceiver)
}) })
} }
@@ -27,7 +27,8 @@ val REPLACED_SUSPENSION_POINT_KEY: FunctionDescriptor.UserDataKey<Boolean> = obj
// Returns suspension function as it's visible within coroutines: // 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` // 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? { fun <D : CallableDescriptor> D.createCoroutineSuspensionFunctionView(): D? {
if (this !is SimpleFunctionDescriptor) return null
if (!isSuspend) return null if (!isSuspend) return null
val returnType = getSuspensionPointReturnType() ?: return null val returnType = getSuspensionPointReturnType() ?: return null
@@ -36,6 +37,7 @@ fun SimpleFunctionDescriptor.createCoroutineSuspensionFunctionView(): SimpleFunc
original.createCoroutineSuspensionFunctionView() original.createCoroutineSuspensionFunctionView()
else null else null
@Suppress("UNCHECKED_CAST")
return newCopyBuilder().apply { return newCopyBuilder().apply {
setReturnType(returnType) setReturnType(returnType)
setOriginal(newOriginal) setOriginal(newOriginal)
@@ -43,7 +45,7 @@ fun SimpleFunctionDescriptor.createCoroutineSuspensionFunctionView(): SimpleFunc
setSignatureChange() setSignatureChange()
setPreserveSourceElement() setPreserveSourceElement()
putUserData(SUSPENSION_POINT_KEY, true) putUserData(SUSPENSION_POINT_KEY, true)
}.build()!! }.build()!! as D
} }
fun SimpleFunctionDescriptor.getSuspensionPointReturnType(): KotlinType? = valueParameters.lastOrNull()?.returnType?.arguments?.getOrNull(0)?.type fun SimpleFunctionDescriptor.getSuspensionPointReturnType(): KotlinType? = valueParameters.lastOrNull()?.returnType?.arguments?.getOrNull(0)?.type