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 475e899b239..014260ff22b 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 @@ -17474,6 +17474,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52207.kt"); } + @Test + @TestMetadata("kt52373.kt") + public void testKt52373() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52373.kt"); + } + @Test @TestMetadata("overload.kt") public void testOverload() throws Exception { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index a3a9805372b..9aa24c46c41 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -496,6 +496,10 @@ fun IrMemberAccessExpression.copyValueArgumentsFrom( } } + while (srcValueArgumentIndex < src.symbol.owner.contextReceiverParametersCount) { + putValueArgument(destValueArgumentIndex++, src.getValueArgument(srcValueArgumentIndex++)) + } + when { receiversAsArguments && srcFunction.extensionReceiverParameter != null -> { putValueArgument(destValueArgumentIndex++, src.extensionReceiver) @@ -1188,29 +1192,55 @@ fun IrFactory.createStaticFunctionWithReceivers( annotations = oldFunction.annotations - var offset = 0 - val dispatchReceiver = oldFunction.dispatchReceiverParameter?.copyTo( - this, - name = Name.identifier("\$this"), - index = offset++, - type = remap(dispatchReceiverType!!), - origin = IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER - ) - val extensionReceiver = oldFunction.extensionReceiverParameter?.copyTo( - this, - name = Name.identifier("\$receiver"), - index = offset++, - origin = IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER, - remapTypeMap = typeParameterMap - ) - valueParameters = listOfNotNull(dispatchReceiver, extensionReceiver) + - oldFunction.valueParameters.map { - it.copyTo( - this, - index = it.index + offset, - remapTypeMap = typeParameterMap - ) - } + valueParameters = buildList { + var offset = 0 + + addIfNotNull( + oldFunction.dispatchReceiverParameter?.copyTo( + this@apply, + name = Name.identifier("\$this"), + index = offset++, + type = remap(dispatchReceiverType!!), + origin = IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER + ) + ) + + addAll( + oldFunction.valueParameters + .asSequence() + .take(oldFunction.contextReceiverParametersCount) + .map { + it.copyTo( + this@apply, + index = offset++, + remapTypeMap = typeParameterMap + ) + } + ) + + addIfNotNull( + oldFunction.extensionReceiverParameter?.copyTo( + this@apply, + name = Name.identifier("\$receiver"), + index = offset++, + origin = IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER, + remapTypeMap = typeParameterMap + ) + ) + + addAll( + oldFunction.valueParameters + .asSequence() + .drop(oldFunction.contextReceiverParametersCount) + .map { + it.copyTo( + this@apply, + index = offset++, + remapTypeMap = typeParameterMap + ) + } + ) + } if (copyMetadata) metadata = oldFunction.metadata diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52373.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52373.kt new file mode 100644 index 00000000000..71154539ed5 --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52373.kt @@ -0,0 +1,18 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR + +class Context +class Extended + +class Containing { + context(Context) fun Extended.foo(obj: Any? = null) {} +} + +fun box(): String { + with (Containing()) { + with (Context()) { + Extended().foo() + } + } + 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 24ab14bde7e..bc3c8f59a74 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 @@ -17474,6 +17474,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52207.kt"); } + @Test + @TestMetadata("kt52373.kt") + public void testKt52373() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt52373.kt"); + } + @Test @TestMetadata("overload.kt") public void testOverload() throws Exception {