Support suspending extension functions
This commit is contained in:
@@ -69,6 +69,8 @@ interface CandidateWithBoundDispatchReceiver<out D : CallableDescriptor> {
|
||||
val diagnostics: List<ResolutionDiagnostic>
|
||||
|
||||
val dispatchReceiver: ReceiverValue?
|
||||
|
||||
fun copy(newDescriptor: @UnsafeVariance D): CandidateWithBoundDispatchReceiver<D>
|
||||
}
|
||||
|
||||
data class ResolutionCandidateStatus(val diagnostics: List<ResolutionDiagnostic>) {
|
||||
|
||||
+18
-2
@@ -21,6 +21,8 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||
import org.jetbrains.kotlin.resolve.coroutine.CoroutineReceiverValue
|
||||
import org.jetbrains.kotlin.resolve.coroutine.createCoroutineSuspensionFunctionView
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.QualifierReceiver
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||
@@ -102,9 +104,23 @@ private class NoExplicitReceiverScopeTowerProcessor<D : CallableDescriptor, C: C
|
||||
}
|
||||
}
|
||||
is TowerData.BothTowerLevelAndImplicitReceiver -> {
|
||||
data.level.collectCandidates(name, data.implicitReceiver).filter { it.requiresExtensionReceiver }.map {
|
||||
context.createCandidate(it, ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, extensionReceiver = data.implicitReceiver)
|
||||
val result = mutableListOf<C>()
|
||||
|
||||
data.level.collectCandidates(name, data.implicitReceiver).filter { it.requiresExtensionReceiver }.forEach {
|
||||
result.add(
|
||||
context.createCandidate(
|
||||
it, ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, extensionReceiver = data.implicitReceiver))
|
||||
|
||||
if (data.implicitReceiver is CoroutineReceiverValue) {
|
||||
val newDescriptor = it.descriptor.createCoroutineSuspensionFunctionView() ?: return@forEach
|
||||
result.add(
|
||||
context.createCandidate(
|
||||
it.copy(newDescriptor = newDescriptor),
|
||||
ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, extensionReceiver = data.implicitReceiver))
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
else -> emptyList()
|
||||
}
|
||||
|
||||
@@ -35,4 +35,7 @@ internal class CandidateWithBoundDispatchReceiverImpl<out D : CallableDescriptor
|
||||
override val dispatchReceiver: ReceiverValue?,
|
||||
override val descriptor: D,
|
||||
override val diagnostics: List<ResolutionDiagnostic>
|
||||
) : CandidateWithBoundDispatchReceiver<D>
|
||||
) : CandidateWithBoundDispatchReceiver<D> {
|
||||
override fun copy(newDescriptor: @UnsafeVariance D) =
|
||||
CandidateWithBoundDispatchReceiverImpl(dispatchReceiver, newDescriptor, diagnostics)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user