KT-51863 Account for context receivers in calls with changed parameter order

This commit is contained in:
Pavel Mikhailovskii
2022-12-06 16:28:08 +00:00
committed by Space Team
parent e9984ce38d
commit 25ad7fe31c
4 changed files with 40 additions and 8 deletions
@@ -406,26 +406,26 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
irCall: IrFunctionAccessExpression,
irResultType: IrType,
contextReceivers: List<IrExpression>
): IrExpression =
if (call.isValueArgumentReorderingRequired()) {
generateCallWithArgumentReordering(irCall, startOffset, endOffset, call, irResultType)
): IrExpression {
contextReceivers.forEachIndexed(irCall::putValueArgument)
return if (call.isValueArgumentReorderingRequired()) {
generateCallWithArgumentReordering(irCall, startOffset, endOffset, call, irResultType, contextReceivers.size)
} else {
for ((index, valueArgument) in contextReceivers.withIndex()) {
irCall.putValueArgument(index, valueArgument)
}
val valueArguments = call.getValueArgumentsInParameterOrder()
for ((index, valueArgument) in valueArguments.withIndex()) {
irCall.putValueArgument(index + contextReceivers.size, valueArgument)
}
irCall
}
}
private fun generateCallWithArgumentReordering(
irCall: IrFunctionAccessExpression,
startOffset: Int,
endOffset: Int,
call: CallBuilder,
irResultType: IrType
irResultType: IrType,
contextReceiversCount: Int
): IrExpression {
val irBlock = IrBlockImpl(startOffset, endOffset, irResultType, IrStatementOrigin.ARGUMENTS_REORDERING_FOR_CALL)
@@ -447,7 +447,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
for (valueArgument in resolvedCall.valueArguments.values) {
val index = valueArgumentsToIndex[valueArgument]!!
val irArgument = call.getValueArgument(valueParameters[index]) ?: continue
irCall.putValueArgument(index, irArgument.freeze(valueParameters[index].name.asString()))
irCall.putValueArgument(index + contextReceiversCount, irArgument.freeze(valueParameters[index].name.asString()))
}
irBlock.statements.add(irCall)
return irBlock