psi2ir: minor: move array access generation code

This commit is contained in:
Dmitry Petrov
2019-02-12 15:43:15 +03:00
parent 50269d3a5c
commit 6889e470d1
2 changed files with 16 additions and 22 deletions
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
import org.jetbrains.kotlin.ir.types.makeNotNull
import org.jetbrains.kotlin.ir.util.referenceClassifier
@@ -504,20 +503,21 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
return generateCall(resolvedCall, expression, origin)
}
fun generateDynamicOperatorExpression(
irOperator: IrDynamicOperator,
irType: IrType,
ktOperatorExpression: KtExpression,
ktReceiverExpression: KtExpression,
ktArgumentExpressions: List<KtExpression>
): IrExpression =
IrDynamicOperatorExpressionImpl(
ktOperatorExpression.startOffsetSkippingComments,
ktOperatorExpression.endOffset,
irType,
irOperator
fun generateDynamicArrayAccess(ktArrayAccessExpression: KtArrayAccessExpression): IrExpression {
val startOffset = ktArrayAccessExpression.startOffsetSkippingComments
val endOffset = ktArrayAccessExpression.endOffset
val kotlinType = context.bindingContext.getType(ktArrayAccessExpression)
?: throw AssertionError("No type for ${ktArrayAccessExpression.text}")
return IrDynamicOperatorExpressionImpl(
startOffset,
endOffset,
kotlinType.toIrType(),
IrDynamicOperator.ARRAY_ACCESS
).apply {
receiver = statementGenerator.generateExpression(ktReceiverExpression)
ktArgumentExpressions.mapTo(arguments) { statementGenerator.generateExpression(it) }
receiver = ktArrayAccessExpression.arrayExpression!!.genExpr()
ktArrayAccessExpression.indexExpressions.mapTo(arguments) { it.genExpr() }
}
}
}
@@ -355,13 +355,7 @@ class StatementGenerator(
val indexedGetCall = getOrFail(BindingContext.INDEXED_LVALUE_GET, expression)
return if (indexedGetCall.resultingDescriptor.isDynamic())
OperatorExpressionGenerator(this).generateDynamicOperatorExpression(
IrDynamicOperator.ARRAY_ACCESS,
indexedGetCall.resultingDescriptor.returnType!!.toIrType(),
expression,
expression.arrayExpression ?: throw AssertionError("Array expression not found"),
expression.indexExpressions
)
OperatorExpressionGenerator(this).generateDynamicArrayAccess(expression)
else
CallGenerator(this).generateCall(
expression.startOffsetSkippingComments, expression.endOffset,