[FIR] Fix collection of annotations for assigment expressions

This commit is contained in:
Ivan Kochurkin
2021-09-17 18:08:24 +03:00
committed by TeamCityServer
parent d0a4ca199d
commit 05b91d37a7
4 changed files with 27 additions and 7 deletions
@@ -293,7 +293,8 @@ class ExpressionsConverter(
binaryExpression.toFirSourceElement(), binaryExpression.toFirSourceElement(),
rightArg, rightArg,
rightArgAsFir, rightArgAsFir,
firOperation firOperation,
leftArgAsFir.annotations
) { getAsFirExpression(this) } ) { getAsFirExpression(this) }
} else { } else {
buildEqualityOperatorCall { buildEqualityOperatorCall {
@@ -2162,7 +2162,13 @@ open class RawFirBuilder(
} else { } else {
val firOperation = operationToken.toFirOperation() val firOperation = operationToken.toFirOperation()
if (firOperation in FirOperation.ASSIGNMENTS) { if (firOperation in FirOperation.ASSIGNMENTS) {
return expression.left.generateAssignment(source, expression.right, rightArgument, firOperation) { return expression.left.generateAssignment(
source,
expression.right,
rightArgument,
firOperation,
leftArgument.annotations
) {
(this as KtExpression).toFirExpression("Incorrect expression in assignment: ${expression.text}") (this as KtExpression).toFirExpression("Incorrect expression in assignment: ${expression.text}")
} }
} else { } else {
@@ -540,7 +540,9 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
generateResolvedAccessExpression(source, resultVar) generateResolvedAccessExpression(source, resultVar)
else else
resultInitializer, resultInitializer,
FirOperation.ASSIGN, convert FirOperation.ASSIGN,
resultInitializer.annotations,
convert
) )
fun appendAssignment() { fun appendAssignment() {
@@ -889,6 +891,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
rhs: T?, rhs: T?,
value: FirExpression, // value is FIR for rhs value: FirExpression, // value is FIR for rhs
operation: FirOperation, operation: FirOperation,
annotations: List<FirAnnotation>,
convert: T.() -> FirExpression convert: T.() -> FirExpression
): FirStatement { ): FirStatement {
val unwrappedLhs = this.unwrap() ?: return buildErrorExpression { val unwrappedLhs = this.unwrap() ?: return buildErrorExpression {
@@ -901,9 +904,11 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
context.arraySetArgument[unwrappedLhs] = value context.arraySetArgument[unwrappedLhs] = value
} }
return if (operation == FirOperation.ASSIGN) { return if (operation == FirOperation.ASSIGN) {
unwrappedLhs.convert() val result = unwrappedLhs.convert()
(result.annotations as MutableList<FirAnnotation>) += annotations
result
} else { } else {
generateAugmentedArraySetCall(unwrappedLhs, baseSource, operation, rhs, convert) generateAugmentedArraySetCall(unwrappedLhs, baseSource, operation, rhs, annotations, convert)
} }
} }
@@ -920,6 +925,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
) )
} }
rightArgument = value rightArgument = value
this.annotations += annotations
} }
} }
require(operation == FirOperation.ASSIGN) require(operation == FirOperation.ASSIGN)
@@ -927,7 +933,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
if (this?.elementType == SAFE_ACCESS_EXPRESSION && this != null) { if (this?.elementType == SAFE_ACCESS_EXPRESSION && this != null) {
val safeCallNonAssignment = convert() as? FirSafeCallExpression val safeCallNonAssignment = convert() as? FirSafeCallExpression
if (safeCallNonAssignment != null) { if (safeCallNonAssignment != null) {
return putAssignmentToSafeCall(safeCallNonAssignment, baseSource, value) return putAssignmentToSafeCall(safeCallNonAssignment, baseSource, value, annotations)
} }
} }
@@ -935,6 +941,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
source = baseSource source = baseSource
rValue = value rValue = value
calleeReference = initializeLValue(unwrappedLhs) { convert() as? FirQualifiedAccess } calleeReference = initializeLValue(unwrappedLhs) { convert() as? FirQualifiedAccess }
this.annotations += annotations
} }
} }
@@ -942,7 +949,8 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
private fun putAssignmentToSafeCall( private fun putAssignmentToSafeCall(
safeCallNonAssignment: FirSafeCallExpression, safeCallNonAssignment: FirSafeCallExpression,
baseSource: KtSourceElement?, baseSource: KtSourceElement?,
value: FirExpression value: FirExpression,
annotations: List<FirAnnotation>
): FirSafeCallExpression { ): FirSafeCallExpression {
val nestedAccess = safeCallNonAssignment.regularQualifiedAccess val nestedAccess = safeCallNonAssignment.regularQualifiedAccess
@@ -951,6 +959,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
rValue = value rValue = value
calleeReference = nestedAccess.calleeReference calleeReference = nestedAccess.calleeReference
explicitReceiver = safeCallNonAssignment.checkedSubjectRef.value explicitReceiver = safeCallNonAssignment.checkedSubjectRef.value
this.annotations += annotations
} }
safeCallNonAssignment.replaceRegularQualifiedAccess( safeCallNonAssignment.replaceRegularQualifiedAccess(
@@ -965,6 +974,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
baseSource: KtSourceElement?, baseSource: KtSourceElement?,
operation: FirOperation, operation: FirOperation,
rhs: T?, rhs: T?,
annotations: List<FirAnnotation>,
convert: T.() -> FirExpression convert: T.() -> FirExpression
): FirStatement { ): FirStatement {
return buildAugmentedArraySetCall { return buildAugmentedArraySetCall {
@@ -972,6 +982,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
this.operation = operation this.operation = operation
assignCall = generateAugmentedCallForAugmentedArraySetCall(unwrappedReceiver, operation, rhs, convert) assignCall = generateAugmentedCallForAugmentedArraySetCall(unwrappedReceiver, operation, rhs, convert)
setGetBlock = generateSetGetBlockForAugmentedArraySetCall(unwrappedReceiver, baseSource, operation, rhs, convert) setGetBlock = generateSetGetBlockForAugmentedArraySetCall(unwrappedReceiver, baseSource, operation, rhs, convert)
this.annotations += annotations
} }
} }
@@ -535,6 +535,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
dispatchReceiver = it.dispatchReceiver dispatchReceiver = it.dispatchReceiver
extensionReceiver = it.extensionReceiver extensionReceiver = it.extensionReceiver
} }
annotations += assignmentOperatorStatement.annotations
} }
return assignment.transform(transformer, ResolutionMode.ContextIndependent) return assignment.transform(transformer, ResolutionMode.ContextIndependent)
} }
@@ -1038,6 +1039,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
val operatorName = FirOperationNameConventions.ASSIGNMENTS.getValue(augmentedArraySetCall.operation) val operatorName = FirOperationNameConventions.ASSIGNMENTS.getValue(augmentedArraySetCall.operation)
val firstCalls = with(augmentedArraySetCall.setGetBlock.statements.last() as FirFunctionCall) setCall@{ val firstCalls = with(augmentedArraySetCall.setGetBlock.statements.last() as FirFunctionCall) setCall@{
(annotations as MutableList<FirAnnotation>) += augmentedArraySetCall.annotations
buildList { buildList {
add(this@setCall) add(this@setCall)
with(arguments.last() as FirFunctionCall) plusCall@{ with(arguments.last() as FirFunctionCall) plusCall@{