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 2dfd6322d71..160533136c1 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 @@ -17432,6 +17432,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/compoundAssignmentOperators.kt"); } + @Test + @TestMetadata("contextAndExtensionLambdaIndy.kt") + public void testContextAndExtensionLambdaIndy() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextAndExtensionLambdaIndy.kt"); + } + @Test @TestMetadata("contextAndExtensionSameName.kt") public void testContextAndExtensionSameName() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt index f99210612c4..43f1de1e9da 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/indy/LambdaMetafactoryArguments.kt @@ -446,13 +446,19 @@ internal class LambdaMetafactoryArgumentsBuilder( val oldToNew = HashMap() var newParameterIndex = 0 + lambda.valueParameters.take(lambda.contextReceiverParametersCount).mapTo(newValueParameters) { oldParameter -> + oldParameter.copy(lambda, newParameterIndex++).also { + oldToNew[oldParameter] = it + } + } + newValueParameters.add( oldExtensionReceiver.copy(lambda, newParameterIndex++, oldExtensionReceiver.name).also { oldToNew[oldExtensionReceiver] = it } ) - lambda.valueParameters.mapTo(newValueParameters) { oldParameter -> + lambda.valueParameters.drop(lambda.contextReceiverParametersCount).mapTo(newValueParameters) { oldParameter -> oldParameter.copy(lambda, newParameterIndex++).also { oldToNew[oldParameter] = it } diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextAndExtensionLambdaIndy.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextAndExtensionLambdaIndy.kt new file mode 100644 index 00000000000..a60e4f34528 --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextAndExtensionLambdaIndy.kt @@ -0,0 +1,24 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// JVM_TARGET: 1.8 +// LAMBDAS: INDY + +class Ctx { + val k = "__K__" +} + +class Scope { + val o = "O" +} + +fun accept(block: context(Ctx) Scope.(Int) -> String) = 1 +fun accept(ref: Any) = 1 + +val foo: context(Ctx) Scope.(fooParam: Int) -> String = { fooArg -> o + k[fooArg] } + +fun box(): String { + accept(foo) + accept(::foo) + + return foo(Ctx(), Scope(), 2) +} 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 ef8852836af..1ba1fc3c793 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 @@ -17432,6 +17432,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/compoundAssignmentOperators.kt"); } + @Test + @TestMetadata("contextAndExtensionLambdaIndy.kt") + public void testContextAndExtensionLambdaIndy() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextAndExtensionLambdaIndy.kt"); + } + @Test @TestMetadata("contextAndExtensionSameName.kt") public void testContextAndExtensionSameName() throws Exception {