Minor. Make extension's receiver to be a type parameter and simplify usage
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user