FIR: Clarify parameter names in BaseFirBuilder.generateIncrementOr*

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