From b44da21f5959f36a5466ff56b593d5eb9ceeb2ff Mon Sep 17 00:00:00 2001 From: Anastasiya Shadrina Date: Wed, 29 Sep 2021 18:30:38 +0700 Subject: [PATCH] [FE] Handle context receivers in NewAbstractResolvedCall --- .../kotlin/resolve/calls/tower/NewAbstractResolvedCall.kt | 1 + .../calls/tower/NewCallableReferenceResolvedCall.kt | 6 ++++++ .../kotlin/resolve/calls/tower/NewResolvedCallImpl.kt | 7 +++++++ .../calls/tower/NewVariableAsFunctionResolvedCallImpl.kt | 3 ++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewAbstractResolvedCall.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewAbstractResolvedCall.kt index db76f68649e..095c226e2f7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewAbstractResolvedCall.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewAbstractResolvedCall.kt @@ -46,6 +46,7 @@ sealed class NewAbstractResolvedCall : ResolvedCall { abstract fun updateDispatchReceiverType(newType: KotlinType) abstract fun updateExtensionReceiverType(newType: KotlinType) + abstract fun updateContextReceiverTypes(newTypes: List) abstract fun containsOnlyOnlyInputTypesErrors(): Boolean abstract fun setResultingSubstitutor(substitutor: NewTypeSubstitutor?) abstract fun argumentToParameterMap( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewCallableReferenceResolvedCall.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewCallableReferenceResolvedCall.kt index 33a06f99265..bb457d0a224 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewCallableReferenceResolvedCall.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewCallableReferenceResolvedCall.kt @@ -65,6 +65,7 @@ class NewCallableReferenceResolvedCall( override fun getExtensionReceiver(): ReceiverValue? = extensionReceiver override fun getDispatchReceiver(): ReceiverValue? = dispatchReceiver + override fun getContextReceivers() = emptyList() override fun updateDispatchReceiverType(newType: KotlinType) { if (dispatchReceiver?.type == newType) return @@ -76,6 +77,11 @@ class NewCallableReferenceResolvedCall( extensionReceiver = extensionReceiver?.replaceType(newType) } + override fun updateContextReceiverTypes(newTypes: List) { + // TODO: Update context receivers + return + } + @Suppress("UNCHECKED_CAST") override fun getCandidateDescriptor(): D = when (resolvedAtom) { is ResolvedCallableReferenceCallAtom -> resolvedAtom.candidateDescriptor as D diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolvedCallImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolvedCallImpl.kt index d2f5159ea54..0ef0f8eee6a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolvedCallImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolvedCallImpl.kt @@ -48,9 +48,11 @@ class NewResolvedCallImpl( private var argumentTypeForConstantConvertedMap: Map? = null private var extensionReceiver = resolvedCallAtom.extensionReceiverArgument?.receiver?.receiverValue private var dispatchReceiver = resolvedCallAtom.dispatchReceiverArgument?.receiver?.receiverValue + private var contextReceivers = resolvedCallAtom.contextReceiversArguments.map { it.receiver.receiverValue } override fun getExtensionReceiver(): ReceiverValue? = extensionReceiver override fun getDispatchReceiver(): ReceiverValue? = dispatchReceiver + override fun getContextReceivers(): List = contextReceivers @Suppress("UNCHECKED_CAST") override fun getCandidateDescriptor(): D = resolvedCallAtom.candidateDescriptor as D @@ -67,6 +69,11 @@ class NewResolvedCallImpl( extensionReceiver = extensionReceiver?.replaceType(newType) } + override fun updateContextReceiverTypes(newTypes: List) { + if (contextReceivers.size != newTypes.size) return + contextReceivers = contextReceivers.zip(newTypes).map { (receiver, type) -> receiver.replaceType(type) } + } + override fun getStatus(): ResolutionStatus = getResultApplicability(diagnostics).toResolutionStatus() override fun getTypeArguments(): Map { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewVariableAsFunctionResolvedCallImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewVariableAsFunctionResolvedCallImpl.kt index b25f3f7f08c..3c1f7a773af 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewVariableAsFunctionResolvedCallImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewVariableAsFunctionResolvedCallImpl.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstituto import org.jetbrains.kotlin.resolve.calls.model.ResolvedCallAtom import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeApproximator import org.jetbrains.kotlin.utils.addToStdlib.cast @@ -34,6 +33,7 @@ class NewVariableAsFunctionResolvedCallImpl( override fun getCandidateDescriptor() = functionCall.candidateDescriptor override fun getResultingDescriptor() = functionCall.resultingDescriptor override fun getExtensionReceiver() = functionCall.extensionReceiver + override fun getContextReceivers() = functionCall.contextReceivers override fun getDispatchReceiver() = functionCall.dispatchReceiver override fun getExplicitReceiverKind() = functionCall.explicitReceiverKind override fun getTypeArguments() = functionCall.typeArguments @@ -41,6 +41,7 @@ class NewVariableAsFunctionResolvedCallImpl( override fun containsOnlyOnlyInputTypesErrors() = functionCall.containsOnlyOnlyInputTypesErrors() override fun updateDispatchReceiverType(newType: KotlinType) = functionCall.updateDispatchReceiverType(newType) override fun updateExtensionReceiverType(newType: KotlinType) = functionCall.updateExtensionReceiverType(newType) + override fun updateContextReceiverTypes(newTypes: List) = functionCall.updateContextReceiverTypes(newTypes) override fun argumentToParameterMap( resultingDescriptor: CallableDescriptor, valueArguments: Map