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) {
result.addAll(result.mapNotNull {
val realDescriptor = it.descriptor
val suspensionFunctionView =
(realDescriptor as? SimpleFunctionDescriptor)?.createCoroutineSuspensionFunctionView() ?: return@mapNotNull null
@Suppress("UNCHECKED_CAST")
createCandidateDescriptor(suspensionFunctionView as D, dispatchReceiver)
val suspensionFunctionView = it.descriptor.createCoroutineSuspensionFunctionView() ?: return@mapNotNull null
createCandidateDescriptor(suspensionFunctionView, dispatchReceiver)
})
}
@@ -27,7 +27,8 @@ val REPLACED_SUSPENSION_POINT_KEY: FunctionDescriptor.UserDataKey<Boolean> = obj
// 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? {
fun <D : CallableDescriptor> D.createCoroutineSuspensionFunctionView(): D? {
if (this !is SimpleFunctionDescriptor) return null
if (!isSuspend) return null
val returnType = getSuspensionPointReturnType() ?: return null
@@ -36,6 +37,7 @@ fun SimpleFunctionDescriptor.createCoroutineSuspensionFunctionView(): SimpleFunc
original.createCoroutineSuspensionFunctionView()
else null
@Suppress("UNCHECKED_CAST")
return newCopyBuilder().apply {
setReturnType(returnType)
setOriginal(newOriginal)
@@ -43,7 +45,7 @@ fun SimpleFunctionDescriptor.createCoroutineSuspensionFunctionView(): SimpleFunc
setSignatureChange()
setPreserveSourceElement()
putUserData(SUSPENSION_POINT_KEY, true)
}.build()!!
}.build()!! as D
}
fun SimpleFunctionDescriptor.getSuspensionPointReturnType(): KotlinType? = valueParameters.lastOrNull()?.returnType?.arguments?.getOrNull(0)?.type