From 278dc14124b2fc486bde05f8acb2d65e82e64f16 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 17 Aug 2016 10:02:51 +0300 Subject: [PATCH] IrSingleExpressionValue --- .../IrOperatorExpressionGenerator.kt | 4 ++-- .../kotlin/psi2ir/generators/IrValue.kt | 19 ++++++------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/IrOperatorExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/IrOperatorExpressionGenerator.kt index b2986b08598..2ebca83630b 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/IrOperatorExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/IrOperatorExpressionGenerator.kt @@ -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) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/IrValue.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/IrValue.kt index df7566c8d21..000e68a93b1 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/IrValue.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/IrValue.kt @@ -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))