diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index a7ebc0077d7..1412e473d46 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -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) }) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/coroutine/coroutineUtil.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/coroutine/coroutineUtil.kt index 8b82f5fbc0b..aca35da27b8 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/coroutine/coroutineUtil.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/coroutine/coroutineUtil.kt @@ -27,7 +27,8 @@ val REPLACED_SUSPENSION_POINT_KEY: FunctionDescriptor.UserDataKey = obj // Returns suspension function as it's visible within coroutines: // E.g. `fun await(f: CompletableFuture): V` instead of `fun await(f: CompletableFuture, machine: Continuation): Unit` -fun SimpleFunctionDescriptor.createCoroutineSuspensionFunctionView(): SimpleFunctionDescriptor? { +fun 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