From 678c74b17f76d078508c7f98b253bd64d0228840 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 28 Jan 2020 10:26:14 +0300 Subject: [PATCH] [NI] Don't forget to update receivers for builder-inference --- .../calls/tower/ResolvedAtomCompleter.kt | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt index acc66b00c2a..c86f276df66 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.resolve.calls.util.CallMaker import org.jetbrains.kotlin.resolve.checkers.MissingDependencySupertypeChecker import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver +import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.expressions.DoubleColonExpressionResolver import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices @@ -314,15 +315,18 @@ class ResolvedAtomCompleter( else -> null } - val explicitReceiver = explicitCallableReceiver?.receiver - val psiCall = CallMaker.makeCall(reference, explicitReceiver?.receiverValue, null, reference, emptyList()) + val explicitReceiver = explicitCallableReceiver?.receiver?.receiverValue?.updateReceiverValue(resultSubstitutor) + val psiCall = CallMaker.makeCall(reference, explicitReceiver, null, reference, emptyList()) val tracing = TracingStrategyImpl.create(reference, psiCall) val temporaryTrace = TemporaryBindingTrace.create(topLevelTrace, "callable reference fake call") + val dispatchReceiver = callableCandidate.dispatchReceiver?.receiver?.receiverValue?.updateReceiverValue(resultSubstitutor) + val extensionReceiver = callableCandidate.extensionReceiver?.receiver?.receiverValue?.updateReceiverValue(resultSubstitutor) + val resolvedCall = ResolvedCallImpl( - psiCall, callableCandidate.candidate, callableCandidate.dispatchReceiver?.receiver?.receiverValue, - callableCandidate.extensionReceiver?.receiver?.receiverValue, callableCandidate.explicitReceiverKind, + psiCall, callableCandidate.candidate, dispatchReceiver, + extensionReceiver, callableCandidate.explicitReceiverKind, null, temporaryTrace, tracing, MutableDataFlowInfoForArguments.WithoutArgumentsCheck(DataFlowInfo.EMPTY) ) resolvedCall.setResultingSubstitutor(resultSubstitutor) @@ -364,6 +368,11 @@ class ResolvedAtomCompleter( kotlinToResolvedCallTransformer.runCallCheckers(resolvedCall, topLevelCallCheckerContext) } + private fun ReceiverValue.updateReceiverValue(substitutor: TypeSubstitutor): ReceiverValue { + val newType = substitutor.safeSubstitute(type, Variance.INVARIANT) + return if (type != newType) replaceType(newType) else this + } + private fun recordArgumentAdaptationForCallableReference( resolvedCall: ResolvedCallImpl, callableReferenceAdaptation: CallableReferenceAdaptation?