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
@@ -17456,6 +17456,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/iteratorOperator.kt");
}
@Test
@TestMetadata("kt51863.kt")
public void testKt51863() throws Exception {
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt");
}
@Test
@TestMetadata("overload.kt")
public void testOverload() throws Exception {
@@ -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
@@ -0,0 +1,20 @@
// !LANGUAGE: +ContextReceivers
// TARGET_BACKEND: JVM_IR
// WITH_STDLIB
import kotlin.test.*
context(String, List<String>)
fun test(x: Any, y: Int = 0): List<Any> = listOf(this@String, this@List, x, y)
fun box(): String {
with("context1") {
with(listOf("context2")) {
assertEquals(
listOf("context1", listOf("context2"), listOf(1), 1),
test(y = 1, x = listOf(1))
)
}
}
return "OK"
}
@@ -17456,6 +17456,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/iteratorOperator.kt");
}
@Test
@TestMetadata("kt51863.kt")
public void testKt51863() throws Exception {
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt");
}
@Test
@TestMetadata("overload.kt")
public void testOverload() throws Exception {