Support suspending extension functions

This commit is contained in:
Denis Zharkov
2016-07-05 18:25:09 +03:00
parent 2cc09f928e
commit 3a59e1d222
9 changed files with 167 additions and 11 deletions
@@ -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>) {
@@ -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)
}