IrSingleExpressionValue

This commit is contained in:
Dmitry Petrov
2016-08-17 10:02:51 +03:00
committed by Dmitry Petrov
parent d7412c449e
commit 278dc14124
2 changed files with 8 additions and 15 deletions
@@ -89,9 +89,9 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
private fun generateLValue(ktLeft: KtExpression, irOperator: IrOperator?): IrLValue {
if (ktLeft is KtArrayAccessExpression) {
val irArrayValue = IrGenerateExpressionValue(irStatementGenerator, ktLeft.arrayExpression!!)
val irArrayValue = IrSingleExpressionValue(irStatementGenerator.generateExpression(ktLeft.arrayExpression!!))
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 indexedSetCall = get(BindingContext.INDEXED_LVALUE_SET, ktLeft)
@@ -33,19 +33,13 @@ interface IrValue {
fun load(): IrExpression
}
inline fun onDemandExpressionValue(crossinline makeExpression: () -> IrExpression) =
object : IrValue {
override fun load() = makeExpression()
}
class IrTemporaryVariableValue(val irVariable: IrVariable) : IrValue {
override fun load(): IrExpression =
irVariable.createDefaultGetExpression()
}
class IrGenerateExpressionValue(val irStatementGenerator: IrStatementGenerator, val ktExpression: KtExpression) : IrValue {
override fun load(): IrExpression =
irStatementGenerator.generateExpression(ktExpression)
class IrSingleExpressionValue(val irExpression: IrExpression) : IrValue {
override fun load() = irExpression
}
interface IrLValue : IrValue {
@@ -137,8 +131,7 @@ class IrIndexedLValue(
defineContextVariables(irBlock, callGenerator)
callGenerator.putValue(indexedSetCall.resultingDescriptor.valueParameters.last(),
onDemandExpressionValue { irExpression })
callGenerator.putValue(indexedSetCall.resultingDescriptor.valueParameters.last(), IrSingleExpressionValue(irExpression))
irBlock.addStatement(callGenerator.generateCall(ktArrayAccessExpression, indexedSetCall, irOperator))
@@ -157,14 +150,14 @@ class IrIndexedLValue(
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
callGenerator.putValue(operatorCallReceiver!!,
onDemandExpressionValue { callGenerator.generateCall(ktArrayAccessExpression, indexedGetCall, irOperator) })
IrSingleExpressionValue(callGenerator.generateCall(ktArrayAccessExpression, indexedGetCall, irOperator)))
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))