NI: clear calls info in coroutine inference before the second analysis of += right side
^KT-39376 Fixed
This commit is contained in:
+16
@@ -5,13 +5,16 @@
|
||||
|
||||
package org.jetbrains.kotlin.resolve.calls.inference
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
|
||||
import org.jetbrains.kotlin.psi.KtDoubleColonExpression
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtReferenceExpression
|
||||
import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||
@@ -337,6 +340,19 @@ class CoroutineInferenceSession(
|
||||
deprecationResolver, moduleDescriptor, context.dataFlowValueFactory, typeApproximator, missingSupertypesResolver
|
||||
)
|
||||
}
|
||||
|
||||
/*
|
||||
* It's used only for `+=` resolve to clear calls info before the second analysis of right side.
|
||||
* TODO: remove it after moving `+=` resolve into OR mechanism
|
||||
*/
|
||||
fun clearCallsInfoByContainingElement(containingElement: KtElement) {
|
||||
commonCalls.removeIf remove@{ callInfo ->
|
||||
val atom = callInfo.callResolutionResult.resultCallAtom.atom
|
||||
if (atom !is PSIKotlinCallImpl) return@remove false
|
||||
|
||||
containingElement.anyDescendantOfType<KtElement> { it == atom.psiCall.callElement }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ComposedSubstitutor(val left: NewTypeSubstitutor, val right: NewTypeSubstitutor) : NewTypeSubstitutor {
|
||||
|
||||
+5
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver;
|
||||
import org.jetbrains.kotlin.resolve.calls.context.CallPosition;
|
||||
import org.jetbrains.kotlin.resolve.calls.context.ContextDependency;
|
||||
import org.jetbrains.kotlin.resolve.calls.context.TemporaryTraceAndCache;
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.CoroutineInferenceSession;
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
||||
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults;
|
||||
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsImpl;
|
||||
@@ -245,6 +246,10 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
|
||||
boolean lhsAssignable = basic.checkLValue(ignoreReportsTrace, context, left, right, expression, false);
|
||||
if (assignmentOperationType == null || lhsAssignable) {
|
||||
// Check for '+'
|
||||
// We should clear calls info for coroutine inference within right side as here we analyze it a second time in another context
|
||||
if (context.inferenceSession instanceof CoroutineInferenceSession) {
|
||||
((CoroutineInferenceSession) context.inferenceSession).clearCallsInfoByContainingElement(expression);
|
||||
}
|
||||
Name counterpartName = OperatorConventions.BINARY_OPERATION_NAMES.get(OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS.get(operationType));
|
||||
binaryOperationDescriptors = components.callResolver.resolveBinaryCall(
|
||||
context.replaceTraceAndCache(temporaryForBinaryOperation).replaceScope(scope),
|
||||
|
||||
Reference in New Issue
Block a user