IrSingleExpressionValue
This commit is contained in:
committed by
Dmitry Petrov
parent
d7412c449e
commit
278dc14124
+2
-2
@@ -89,9 +89,9 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
|
|||||||
|
|
||||||
private fun generateLValue(ktLeft: KtExpression, irOperator: IrOperator?): IrLValue {
|
private fun generateLValue(ktLeft: KtExpression, irOperator: IrOperator?): IrLValue {
|
||||||
if (ktLeft is KtArrayAccessExpression) {
|
if (ktLeft is KtArrayAccessExpression) {
|
||||||
val irArrayValue = IrGenerateExpressionValue(irStatementGenerator, ktLeft.arrayExpression!!)
|
val irArrayValue = IrSingleExpressionValue(irStatementGenerator.generateExpression(ktLeft.arrayExpression!!))
|
||||||
val indexExpressions = ktLeft.indexExpressions.map {
|
val indexExpressions = ktLeft.indexExpressions.map {
|
||||||
it to IrGenerateExpressionValue(irStatementGenerator, it)
|
it to IrSingleExpressionValue(irStatementGenerator.generateExpression(it))
|
||||||
}
|
}
|
||||||
val indexedGetCall = get(BindingContext.INDEXED_LVALUE_GET, ktLeft)
|
val indexedGetCall = get(BindingContext.INDEXED_LVALUE_GET, ktLeft)
|
||||||
val indexedSetCall = get(BindingContext.INDEXED_LVALUE_SET, ktLeft)
|
val indexedSetCall = get(BindingContext.INDEXED_LVALUE_SET, ktLeft)
|
||||||
|
|||||||
@@ -33,19 +33,13 @@ interface IrValue {
|
|||||||
fun load(): IrExpression
|
fun load(): IrExpression
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun onDemandExpressionValue(crossinline makeExpression: () -> IrExpression) =
|
|
||||||
object : IrValue {
|
|
||||||
override fun load() = makeExpression()
|
|
||||||
}
|
|
||||||
|
|
||||||
class IrTemporaryVariableValue(val irVariable: IrVariable) : IrValue {
|
class IrTemporaryVariableValue(val irVariable: IrVariable) : IrValue {
|
||||||
override fun load(): IrExpression =
|
override fun load(): IrExpression =
|
||||||
irVariable.createDefaultGetExpression()
|
irVariable.createDefaultGetExpression()
|
||||||
}
|
}
|
||||||
|
|
||||||
class IrGenerateExpressionValue(val irStatementGenerator: IrStatementGenerator, val ktExpression: KtExpression) : IrValue {
|
class IrSingleExpressionValue(val irExpression: IrExpression) : IrValue {
|
||||||
override fun load(): IrExpression =
|
override fun load() = irExpression
|
||||||
irStatementGenerator.generateExpression(ktExpression)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IrLValue : IrValue {
|
interface IrLValue : IrValue {
|
||||||
@@ -137,8 +131,7 @@ class IrIndexedLValue(
|
|||||||
|
|
||||||
defineContextVariables(irBlock, callGenerator)
|
defineContextVariables(irBlock, callGenerator)
|
||||||
|
|
||||||
callGenerator.putValue(indexedSetCall.resultingDescriptor.valueParameters.last(),
|
callGenerator.putValue(indexedSetCall.resultingDescriptor.valueParameters.last(), IrSingleExpressionValue(irExpression))
|
||||||
onDemandExpressionValue { irExpression })
|
|
||||||
|
|
||||||
irBlock.addStatement(callGenerator.generateCall(ktArrayAccessExpression, indexedSetCall, irOperator))
|
irBlock.addStatement(callGenerator.generateCall(ktArrayAccessExpression, indexedSetCall, irOperator))
|
||||||
|
|
||||||
@@ -157,14 +150,14 @@ class IrIndexedLValue(
|
|||||||
|
|
||||||
defineContextVariables(irBlock, callGenerator)
|
defineContextVariables(irBlock, callGenerator)
|
||||||
|
|
||||||
callGenerator.putValue(operatorCall.resultingDescriptor.valueParameters[0], onDemandExpressionValue { irRhs })
|
callGenerator.putValue(operatorCall.resultingDescriptor.valueParameters[0], IrSingleExpressionValue(irRhs))
|
||||||
|
|
||||||
val operatorCallReceiver = operatorCall.extensionReceiver ?: operatorCall.dispatchReceiver
|
val operatorCallReceiver = operatorCall.extensionReceiver ?: operatorCall.dispatchReceiver
|
||||||
callGenerator.putValue(operatorCallReceiver!!,
|
callGenerator.putValue(operatorCallReceiver!!,
|
||||||
onDemandExpressionValue { callGenerator.generateCall(ktArrayAccessExpression, indexedGetCall, irOperator) })
|
IrSingleExpressionValue(callGenerator.generateCall(ktArrayAccessExpression, indexedGetCall, irOperator)))
|
||||||
|
|
||||||
callGenerator.putValue(indexedSetCall.resultingDescriptor.valueParameters.last(),
|
callGenerator.putValue(indexedSetCall.resultingDescriptor.valueParameters.last(),
|
||||||
onDemandExpressionValue { callGenerator.generateCall(ktArrayAccessExpression, operatorCall, irOperator) })
|
IrSingleExpressionValue(callGenerator.generateCall(ktArrayAccessExpression, operatorCall, irOperator)))
|
||||||
|
|
||||||
irBlock.addStatement(callGenerator.generateCall(ktArrayAccessExpression, indexedSetCall, irOperator))
|
irBlock.addStatement(callGenerator.generateCall(ktArrayAccessExpression, indexedSetCall, irOperator))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user