diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index d09b6737810..2cb176fd24f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -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 { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt index bb2353dbdbf..2343a8b5752 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt @@ -406,26 +406,26 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator irCall: IrFunctionAccessExpression, irResultType: IrType, contextReceivers: List - ): 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 diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt new file mode 100644 index 00000000000..55bfec438bb --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51863.kt @@ -0,0 +1,20 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// WITH_STDLIB + +import kotlin.test.* + +context(String, List) +fun test(x: Any, y: Int = 0): List = 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" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 18ed1195550..a3ef1974cb8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -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 {