diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index 9eb9bb9aa02..e5118fa984a 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -452,22 +452,22 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte /** * given: - * argument++ + * receiver++ * * result: * { - * val = argument - * argument = .inc() + * val = receiver + * receiver = .inc() * ^ * } * * given: - * ++argument + * ++receiver * * result: * { - * val = argument.inc() - * argument = + * val = receiver.inc() + * receiver = * ^ * } * @@ -477,33 +477,34 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte // 1. Support receiver capturing for `a?.b++` (elementType == SAFE_ACCESS_EXPRESSION). // 2. Add box test cases for #1 where receiver expression has side effects. fun generateIncrementOrDecrementBlock( - baseExpression: T, + // Used to obtain source-element or text + wholeExpression: T, operationReference: T?, - argument: T?, + receiver: T?, callName: Name, prefix: Boolean, convert: T.() -> FirExpression ): FirExpression { - val unwrappedArgument = argument.unwrap() ?: return buildErrorExpression { + val unwrappedReceiver = receiver.unwrap() ?: return buildErrorExpression { diagnostic = ConeSimpleDiagnostic("Inc/dec without operand", DiagnosticKind.Syntax) } - if (unwrappedArgument.elementType == DOT_QUALIFIED_EXPRESSION) { + if (unwrappedReceiver.elementType == DOT_QUALIFIED_EXPRESSION) { return generateIncrementOrDecrementBlockForQualifiedAccess( - baseExpression, + wholeExpression, operationReference, - unwrappedArgument, + unwrappedReceiver, callName, prefix, convert ) } - if (unwrappedArgument.elementType == ARRAY_ACCESS_EXPRESSION) { + if (unwrappedReceiver.elementType == ARRAY_ACCESS_EXPRESSION) { return generateIncrementOrDecrementBlockForArrayAccess( - baseExpression, + wholeExpression, operationReference, - unwrappedArgument, + unwrappedReceiver, callName, prefix, convert @@ -511,7 +512,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } return buildBlock { - val baseSource = baseExpression?.toFirSourceElement() + val baseSource = wholeExpression?.toFirSourceElement() val desugaredSource = baseSource?.fakeElement(KtFakeSourceElementKind.DesugaredIncrementOrDecrement) source = desugaredSource @@ -520,7 +521,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte baseModuleData, desugaredSource, SpecialNames.UNARY, - unwrappedArgument.convert() + unwrappedReceiver.convert() ) // resultInitializer is the expression for `argument.inc()` @@ -531,7 +532,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte name = callName } explicitReceiver = if (prefix) { - unwrappedArgument.convert() + unwrappedReceiver.convert() } else { generateResolvedAccessExpression(desugaredSource, initialValueVar) } @@ -546,10 +547,10 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte resultInitializer ) - val assignment = unwrappedArgument.generateAssignment( + val assignment = unwrappedReceiver.generateAssignment( desugaredSource, null, - if (prefix && unwrappedArgument.elementType != REFERENCE_EXPRESSION) + if (prefix && unwrappedReceiver.elementType != REFERENCE_EXPRESSION) generateResolvedAccessExpression(source, resultVar) else resultInitializer, @@ -568,13 +569,13 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } if (prefix) { - if (unwrappedArgument.elementType != REFERENCE_EXPRESSION) { + if (unwrappedReceiver.elementType != REFERENCE_EXPRESSION) { statements += resultVar appendAssignment() statements += generateResolvedAccessExpression(desugaredSource, resultVar) } else { appendAssignment() - statements += generateAccessExpression(desugaredSource, desugaredSource, unwrappedArgument.getReferencedNameAsName()) + statements += generateAccessExpression(desugaredSource, desugaredSource, unwrappedReceiver.getReferencedNameAsName()) } } else { statements += initialValueVar @@ -623,34 +624,34 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte * */ private fun generateIncrementOrDecrementBlockForQualifiedAccess( - baseExpression: T, + wholeExpression: T, operationReference: T?, - argument: T, + receiverForOperation: T, callName: Name, prefix: Boolean, convert: T.() -> FirExpression ): FirExpression { return buildBlock { - val baseSource = baseExpression?.toFirSourceElement() + val baseSource = wholeExpression?.toFirSourceElement() val desugaredSource = baseSource?.fakeElement(KtFakeSourceElementKind.DesugaredIncrementOrDecrement) source = desugaredSource - val argumentReceiver = argument.receiverExpression - val argumentSelector = argument.selectorExpression + val argumentReceiver = receiverForOperation.receiverExpression + val argumentSelector = receiverForOperation.selectorExpression val argumentReceiverVariable = generateTemporaryVariable( baseModuleData, argumentReceiver?.toFirSourceElement(), Name.special(""), argumentReceiver?.convert() ?: buildErrorExpression { - source = argument.toFirSourceElement() + source = receiverForOperation.toFirSourceElement() diagnostic = ConeSimpleDiagnostic("Qualified expression without receiver", DiagnosticKind.Syntax) } ).also { statements += it } val firArgument = generateResolvedAccessExpression(argumentReceiverVariable.source, argumentReceiverVariable).let { receiver -> val firArgumentSelector = argumentSelector?.convert() ?: buildErrorExpression { - source = argument.toFirSourceElement() + source = receiverForOperation.toFirSourceElement() diagnostic = ConeSimpleDiagnostic("Qualified expression without selector", DiagnosticKind.Syntax) } firArgumentSelector.also { if (it is FirQualifiedAccessExpression) it.replaceExplicitReceiver(receiver) } @@ -746,28 +747,28 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte * */ private fun generateIncrementOrDecrementBlockForArrayAccess( - baseExpression: T, + wholeExpression: T, operationReference: T?, - argument: T, + receiver: T, callName: Name, prefix: Boolean, convert: T.() -> FirExpression ): FirExpression { return buildBlock { - val baseSource = baseExpression?.toFirSourceElement() + val baseSource = wholeExpression?.toFirSourceElement() val desugaredSource = baseSource?.fakeElement(KtFakeSourceElementKind.DesugaredIncrementOrDecrement) source = desugaredSource - val array = argument.arrayExpression - val indices = argument.indexExpressions - requireNotNull(indices) { "No indices in ${baseExpression.asText}" } + val array = receiver.arrayExpression + val indices = receiver.indexExpressions + requireNotNull(indices) { "No indices in ${wholeExpression.asText}" } val arrayVariable = generateTemporaryVariable( baseModuleData, array?.toFirSourceElement(), Name.special(""), array?.convert() ?: buildErrorExpression { - source = argument.toFirSourceElement() + source = receiver.toFirSourceElement() diagnostic = ConeSimpleDiagnostic("No array expression", DiagnosticKind.Syntax) } ).also { statements += it } @@ -784,7 +785,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte val firArgument = buildFunctionCall { source = desugaredSource calleeReference = buildSimpleNamedReference { - source = argument?.toFirSourceElement() + source = receiver?.toFirSourceElement() name = OperatorNameConventions.GET } explicitReceiver = generateResolvedAccessExpression(arrayVariable.source, arrayVariable) @@ -831,7 +832,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte statements += buildFunctionCall { source = desugaredSource calleeReference = buildSimpleNamedReference { - source = argument.toFirSourceElement() + source = receiver.toFirSourceElement() name = OperatorNameConventions.SET } explicitReceiver = generateResolvedAccessExpression(arrayVariable.source, arrayVariable)