[FE] Handle context receivers in NewAbstractResolvedCall

This commit is contained in:
Anastasiya Shadrina
2021-09-29 18:30:38 +07:00
committed by TeamCityServer
parent 6d1e5637a7
commit b44da21f59
4 changed files with 16 additions and 1 deletions
@@ -46,6 +46,7 @@ sealed class NewAbstractResolvedCall<D : CallableDescriptor> : ResolvedCall<D> {
abstract fun updateDispatchReceiverType(newType: KotlinType)
abstract fun updateExtensionReceiverType(newType: KotlinType)
abstract fun updateContextReceiverTypes(newTypes: List<KotlinType>)
abstract fun containsOnlyOnlyInputTypesErrors(): Boolean
abstract fun setResultingSubstitutor(substitutor: NewTypeSubstitutor?)
abstract fun argumentToParameterMap(
@@ -65,6 +65,7 @@ class NewCallableReferenceResolvedCall<D : CallableDescriptor>(
override fun getExtensionReceiver(): ReceiverValue? = extensionReceiver
override fun getDispatchReceiver(): ReceiverValue? = dispatchReceiver
override fun getContextReceivers() = emptyList<ReceiverValue>()
override fun updateDispatchReceiverType(newType: KotlinType) {
if (dispatchReceiver?.type == newType) return
@@ -76,6 +77,11 @@ class NewCallableReferenceResolvedCall<D : CallableDescriptor>(
extensionReceiver = extensionReceiver?.replaceType(newType)
}
override fun updateContextReceiverTypes(newTypes: List<KotlinType>) {
// TODO: Update context receivers
return
}
@Suppress("UNCHECKED_CAST")
override fun getCandidateDescriptor(): D = when (resolvedAtom) {
is ResolvedCallableReferenceCallAtom -> resolvedAtom.candidateDescriptor as D
@@ -48,9 +48,11 @@ class NewResolvedCallImpl<D : CallableDescriptor>(
private var argumentTypeForConstantConvertedMap: Map<KtExpression, IntegerValueTypeConstant>? = 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<ReceiverValue> = contextReceivers
@Suppress("UNCHECKED_CAST")
override fun getCandidateDescriptor(): D = resolvedCallAtom.candidateDescriptor as D
@@ -67,6 +69,11 @@ class NewResolvedCallImpl<D : CallableDescriptor>(
extensionReceiver = extensionReceiver?.replaceType(newType)
}
override fun updateContextReceiverTypes(newTypes: List<KotlinType>) {
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<TypeParameterDescriptor, KotlinType> {
@@ -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<KotlinType>) = functionCall.updateContextReceiverTypes(newTypes)
override fun argumentToParameterMap(
resultingDescriptor: CallableDescriptor,
valueArguments: Map<ValueParameterDescriptor, ResolvedValueArgument>