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.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
sealed class ResolutionMode(val forceFullCompletion: Boolean) { sealed class ResolutionMode(
sealed class ContextDependent : ResolutionMode(forceFullCompletion = false) { 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() { companion object Default : ContextDependent() {
override fun toString(): String = "ContextDependent" override fun toString(): String = "ContextDependent"
} }
data object Delegate : ContextDependent() data object Delegate : ContextDependent()
data object AugmentedAssignmentCallOption : ContextDependent(skipCompletion = true)
} }
data object ContextIndependent : ResolutionMode(forceFullCompletion = true) data object ContextIndependent : ResolutionMode(forceFullCompletion = true)
@@ -75,6 +75,8 @@ class FirCallCompleter(
resolutionMode, resolutionMode,
) )
if (resolutionMode.skipEvenPartialCompletion) return call
val completionMode = candidate.computeCompletionMode( val completionMode = candidate.computeCompletionMode(
session.inferenceComponents, resolutionMode, initialType session.inferenceComponents, resolutionMode, initialType
).let { ).let {
@@ -418,6 +418,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
functionCall.transformAnnotations(transformer, data) functionCall.transformAnnotations(transformer, data)
functionCall.replaceLambdaArgumentInvocationKinds(session) functionCall.replaceLambdaArgumentInvocationKinds(session)
functionCall.transformTypeArguments(transformer, ResolutionMode.ContextIndependent) functionCall.transformTypeArguments(transformer, ResolutionMode.ContextIndependent)
val resolvingAugmentedAssignment = data == ResolutionMode.ContextDependent.AugmentedAssignmentCallOption
val withTransformedArguments = if (!resolvingAugmentedAssignment) { val withTransformedArguments = if (!resolvingAugmentedAssignment) {
dataFlowAnalyzer.enterCallArguments(functionCall, functionCall.arguments) dataFlowAnalyzer.enterCallArguments(functionCall, functionCall.arguments)
// In provideDelegate mode the explicitReceiver is already resolved // In provideDelegate mode the explicitReceiver is already resolved
@@ -599,17 +600,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
// x.plusAssign(y) // x.plusAssign(y)
val assignOperatorCall = generator.createAssignOperatorCall(KtFakeSourceElementKind.DesugaredCompoundAssignment) val assignOperatorCall = generator.createAssignOperatorCall(KtFakeSourceElementKind.DesugaredCompoundAssignment)
val resolvedAssignCall = resolveCandidateForAssignmentOperatorCall { val resolvedAssignCall = assignOperatorCall.resolveCandidateForAssignmentOperatorCall()
assignOperatorCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val assignCallReference = resolvedAssignCall.calleeReference as? FirNamedReferenceWithCandidate val assignCallReference = resolvedAssignCall.calleeReference as? FirNamedReferenceWithCandidate
val assignIsSuccessful = assignCallReference?.isError == false val assignIsSuccessful = assignCallReference?.isError == false
// x = x + y // x = x + y
val simpleOperatorCall = generator.createSimpleOperatorCall(KtFakeSourceElementKind.DesugaredCompoundAssignment) val simpleOperatorCall = generator.createSimpleOperatorCall(KtFakeSourceElementKind.DesugaredCompoundAssignment)
val resolvedOperatorCall = resolveCandidateForAssignmentOperatorCall { val resolvedOperatorCall = simpleOperatorCall.resolveCandidateForAssignmentOperatorCall()
simpleOperatorCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val operatorCallReference = resolvedOperatorCall.calleeReference as? FirNamedReferenceWithCandidate val operatorCallReference = resolvedOperatorCall.calleeReference as? FirNamedReferenceWithCandidate
val operatorIsSuccessful = operatorCallReference?.isError == false val operatorIsSuccessful = operatorCallReference?.isError == false
@@ -822,22 +819,12 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
return equalityOperatorCall return equalityOperatorCall
} }
private var resolvingAugmentedAssignment: Boolean = false private fun FirFunctionCall.resolveCandidateForAssignmentOperatorCall(): FirFunctionCall {
return transformFunctionCallInternal(
private inline fun <T> resolveCandidateForAssignmentOperatorCall(block: () -> T): T { this,
assert(!resolvingAugmentedAssignment) ResolutionMode.ContextDependent.AugmentedAssignmentCallOption,
resolvingAugmentedAssignment = true provideDelegate = false
return try { ) as FirFunctionCall
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 FirTypeRef.withTypeArgumentsForBareType(argument: FirExpression, operation: FirOperation): FirTypeRef { private fun FirTypeRef.withTypeArgumentsForBareType(argument: FirExpression, operation: FirOperation): FirTypeRef {
@@ -1424,9 +1411,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
// a.get(b).plusAssign(c) // a.get(b).plusAssign(c)
val assignOperatorCall = generator.createAssignOperatorCall(operation.toArrayAugmentedAssignSourceKind()) val assignOperatorCall = generator.createAssignOperatorCall(operation.toArrayAugmentedAssignSourceKind())
val resolvedAssignCall = resolveCandidateForAssignmentOperatorCall { val resolvedAssignCall = assignOperatorCall.resolveCandidateForAssignmentOperatorCall()
assignOperatorCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val assignCallReference = resolvedAssignCall.calleeReference as? FirNamedReferenceWithCandidate val assignCallReference = resolvedAssignCall.calleeReference as? FirNamedReferenceWithCandidate
val assignIsSuccessful = assignCallReference?.isError == false val assignIsSuccessful = assignCallReference?.isError == false
@@ -1628,9 +1613,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
) )
val operatorCall = generator.createSimpleOperatorCall(augmentedArraySetCall.operation.toArrayAugmentedAssignSourceKind()) val operatorCall = generator.createSimpleOperatorCall(augmentedArraySetCall.operation.toArrayAugmentedAssignSourceKind())
val resolvedOperatorCall = resolveCandidateForAssignmentOperatorCall { val resolvedOperatorCall = operatorCall.resolveCandidateForAssignmentOperatorCall()
operatorCall.transformSingle(this, ResolutionMode.ContextDependent)
}
val setCall = GeneratorOfPlusAssignCalls.createFunctionCall( val setCall = GeneratorOfPlusAssignCalls.createFunctionCall(
OperatorNameConventions.SET, OperatorNameConventions.SET,
@@ -1641,9 +1624,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
*indicesQualifiedAccess.toTypedArray(), // indices *indicesQualifiedAccess.toTypedArray(), // indices
resolvedOperatorCall // a.get(b).plus(c) resolvedOperatorCall // a.get(b).plus(c)
) )
val resolvedSetCall = resolveCandidateForAssignmentOperatorCall { val resolvedSetCall = setCall.resolveCandidateForAssignmentOperatorCall()
setCall.transformSingle(this, ResolutionMode.ContextDependent)
}
return AugmentedArraySetAsGetSetCallDesugaringInfo( return AugmentedArraySetAsGetSetCallDesugaringInfo(
augmentedArraySetCall, augmentedArraySetCall,