FIR: Clarify parameter names in BaseFirBuilder.generateIncrementOr*
This commit is contained in:
+39
-38
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user