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 ca06a460c53..fac9c616693 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("kt51284.kt") + public void testKt51284() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51284.kt"); + } + @Test @TestMetadata("kt51863.kt") public void testKt51863() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index ec4a39f261d..c7358344b45 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -387,12 +387,15 @@ private fun FirSimpleFunction.getFunctionTypeForAbstractMethod(): ConeLookupTagB val parameterTypes = valueParameters.map { it.returnTypeRef.coneTypeSafe() ?: ConeErrorType(ConeIntermediateDiagnostic("No type for parameter $it")) } - + val contextReceiversTypes = contextReceivers.map { + it.typeRef.coneTypeSafe() ?: ConeErrorType(ConeIntermediateDiagnostic("No type for context receiver $it")) + } return createFunctionalType( parameterTypes, receiverType = receiverParameter?.typeRef?.coneType, rawReturnType = returnTypeRef.coneType, - isSuspend = this.isSuspend + isSuspend = this.isSuspend, + contextReceivers = contextReceiversTypes ) } diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51284.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51284.kt new file mode 100644 index 00000000000..31adc0dddc0 --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51284.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR + +class Context + +fun interface SAM { + context(Context) + fun foo(x: Int): Int +} + +fun box(): String { + val sam1 = SAM { x -> x + 1 } + val sam2 = SAM { 2 } + val sam3 = SAM { it + 1 } + + with(Context()) { + sam1.foo(0) + sam2.foo(0) + sam3.foo(0) + } + + 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 beb25b8c8a4..fde87815b77 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("kt51284.kt") + public void testKt51284() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51284.kt"); + } + @Test @TestMetadata("kt51863.kt") public void testKt51863() throws Exception { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConversionResolverImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConversionResolverImpl.kt index d3f063e825c..8c4947ba078 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConversionResolverImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConversionResolverImpl.kt @@ -77,14 +77,14 @@ fun getFunctionTypeForAbstractMethod( val parameterNames = ArrayList(valueParameters.size) val contextReceiversTypes = function.contextReceiverParameters.map { it.type } - var startIndex = contextReceiversTypes.size + var startIndex = 0 var receiverType: KotlinType? = null val extensionReceiver = function.extensionReceiverParameter if (extensionReceiver != null) { receiverType = extensionReceiver.type } else if (shouldConvertFirstParameterToDescriptor && function.valueParameters.isNotEmpty()) { receiverType = valueParameters[0].type - startIndex += 1 + startIndex = 1 } for (i in startIndex until valueParameters.size) {