K2: Get rid of using inference session for augmented assignments

Instead, use specific resolution mode handled by call completer.
Mostly, it's done for simplification of PCLA implementation because
otherwise we would need to track how PCLA inference session and the
one for augmented should be combined.

But just independently of this, not using inference session here,
it looks just simpler.

^KT-59791 In Progress
This commit is contained in:
Denis.Zharkov
2023-12-20 11:02:37 +01:00
committed by Space Team
parent 4e26c9f2ba
commit ca9372cfa0
3 changed files with 23 additions and 33 deletions
@@ -11,13 +11,20 @@ import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
sealed class ResolutionMode(val forceFullCompletion: Boolean) {
sealed class ContextDependent : ResolutionMode(forceFullCompletion = false) {
sealed class ResolutionMode(
val forceFullCompletion: Boolean,
// Only true AugmentedAssignmentCallOption, don't run an even slightest form of completion
val skipEvenPartialCompletion: Boolean = false,
) {
sealed class ContextDependent(
skipCompletion: Boolean = false,
) : ResolutionMode(forceFullCompletion = false, skipCompletion) {
companion object Default : ContextDependent() {
override fun toString(): String = "ContextDependent"
}
data object Delegate : ContextDependent()
data object AugmentedAssignmentCallOption : ContextDependent(skipCompletion = true)
}
data object ContextIndependent : ResolutionMode(forceFullCompletion = true)
@@ -75,6 +75,8 @@ class FirCallCompleter(
resolutionMode,
)
if (resolutionMode.skipEvenPartialCompletion) return call
val completionMode = candidate.computeCompletionMode(
session.inferenceComponents, resolutionMode, initialType
).let {
@@ -418,6 +418,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
functionCall.transformAnnotations(transformer, data)
functionCall.replaceLambdaArgumentInvocationKinds(session)
functionCall.transformTypeArguments(transformer, ResolutionMode.ContextIndependent)
val resolvingAugmentedAssignment = data == ResolutionMode.ContextDependent.AugmentedAssignmentCallOption
val withTransformedArguments = if (!resolvingAugmentedAssignment) {
dataFlowAnalyzer.enterCallArguments(functionCall, functionCall.arguments)
// In provideDelegate mode the explicitReceiver is already resolved
@@ -599,17 +600,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
// x.plusAssign(y)
val assignOperatorCall = generator.createAssignOperatorCall(KtFakeSourceElementKind.DesugaredCompoundAssignment)
val resolvedAssignCall = resolveCandidateForAssignmentOperatorCall {
assignOperatorCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val resolvedAssignCall = assignOperatorCall.resolveCandidateForAssignmentOperatorCall()
val assignCallReference = resolvedAssignCall.calleeReference as? FirNamedReferenceWithCandidate
val assignIsSuccessful = assignCallReference?.isError == false
// x = x + y
val simpleOperatorCall = generator.createSimpleOperatorCall(KtFakeSourceElementKind.DesugaredCompoundAssignment)
val resolvedOperatorCall = resolveCandidateForAssignmentOperatorCall {
simpleOperatorCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val resolvedOperatorCall = simpleOperatorCall.resolveCandidateForAssignmentOperatorCall()
val operatorCallReference = resolvedOperatorCall.calleeReference as? FirNamedReferenceWithCandidate
val operatorIsSuccessful = operatorCallReference?.isError == false
@@ -822,22 +819,12 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
return equalityOperatorCall
}
private var resolvingAugmentedAssignment: Boolean = false
private inline fun <T> resolveCandidateForAssignmentOperatorCall(block: () -> T): T {
assert(!resolvingAugmentedAssignment)
resolvingAugmentedAssignment = true
return try {
context.withInferenceSession(InferenceSessionForAssignmentOperatorCall) {
block()
}
} finally {
resolvingAugmentedAssignment = false
}
}
private object InferenceSessionForAssignmentOperatorCall : FirStubInferenceSession() {
override fun <T> shouldRunCompletion(call: T): Boolean where T : FirStatement, T : FirResolvable = false
private fun FirFunctionCall.resolveCandidateForAssignmentOperatorCall(): FirFunctionCall {
return transformFunctionCallInternal(
this,
ResolutionMode.ContextDependent.AugmentedAssignmentCallOption,
provideDelegate = false
) as FirFunctionCall
}
private fun FirTypeRef.withTypeArgumentsForBareType(argument: FirExpression, operation: FirOperation): FirTypeRef {
@@ -1424,9 +1411,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
// a.get(b).plusAssign(c)
val assignOperatorCall = generator.createAssignOperatorCall(operation.toArrayAugmentedAssignSourceKind())
val resolvedAssignCall = resolveCandidateForAssignmentOperatorCall {
assignOperatorCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val resolvedAssignCall = assignOperatorCall.resolveCandidateForAssignmentOperatorCall()
val assignCallReference = resolvedAssignCall.calleeReference as? FirNamedReferenceWithCandidate
val assignIsSuccessful = assignCallReference?.isError == false
@@ -1628,9 +1613,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
)
val operatorCall = generator.createSimpleOperatorCall(augmentedArraySetCall.operation.toArrayAugmentedAssignSourceKind())
val resolvedOperatorCall = resolveCandidateForAssignmentOperatorCall {
operatorCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val resolvedOperatorCall = operatorCall.resolveCandidateForAssignmentOperatorCall()
val setCall = GeneratorOfPlusAssignCalls.createFunctionCall(
OperatorNameConventions.SET,
@@ -1641,9 +1624,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
*indicesQualifiedAccess.toTypedArray(), // indices
resolvedOperatorCall // a.get(b).plus(c)
)
val resolvedSetCall = resolveCandidateForAssignmentOperatorCall {
setCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val resolvedSetCall = setCall.resolveCandidateForAssignmentOperatorCall()
return AugmentedArraySetAsGetSetCallDesugaringInfo(
augmentedArraySetCall,