[FIR] Add explanations for ResolutionMode.AssignmentLValue

This commit is contained in:
Kirill Rakhman
2023-02-01 13:01:44 +01:00
committed by Space Team
parent 0aa50a559f
commit 0af3a54950
2 changed files with 16 additions and 1 deletions
@@ -86,6 +86,17 @@ sealed class ResolutionMode {
}
}
/**
* This resolution mode is used for resolving the LHS of assignments.
*
* It is generally treated like [ContextIndependent], however it carries the containing assignment which is needed for
* call-site-dependant resolution to detect cases where the setter of the called property needs to be considered instead of the getter.
*
* Examples are:
*
* - assigning to a property with a setter that has a different visibility than the property
* - assigning to a non-deprecated property with a setter that is deprecated
*/
class AssignmentLValue(val variableAssignment: FirVariableAssignment) : ResolutionMode() {
override fun toString(): String = "AssignmentLValue: ${variableAssignment.render()}"
}
@@ -151,7 +151,8 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
val transformedCallee = resolveQualifiedAccessAndSelectCandidate(
qualifiedAccessExpression,
isUsedAsReceiver,
when (data) {
// Set the correct call site. For assignment LHSs, it's the assignment, otherwise it's the qualified access itself.
callSite = when (data) {
is ResolutionMode.AssignmentLValue -> data.variableAssignment
else -> qualifiedAccessExpression
}
@@ -168,6 +169,9 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
}
}
}
// If we're resolving the LHS of an assignment, skip DFA to prevent the access being treated as a variable read and
// smart-casts being applied.
if (data !is ResolutionMode.AssignmentLValue) {
when (result) {
is FirQualifiedAccessExpression -> {