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 e367acdcf95..71929e1588c 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 @@ -17468,6 +17468,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/iteratorOperator.kt"); } + @Test + @TestMetadata("kt51247.kt") + public void testKt51247() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51247.kt"); + } + @Test @TestMetadata("kt51284.kt") public void testKt51284() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt index 3fd57da6a97..14462a6a1f1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt @@ -137,7 +137,8 @@ private fun buildReflectionType( receiverType = receiverType.takeIf { fir.receiverParameter != null }, rawReturnType = returnType, isKFunctionType = true, - isSuspend = isSuspend + isSuspend = isSuspend, + contextReceivers = fir.contextReceivers.map { it.typeRef.coneType } ) to callableReferenceAdaptation } is FirVariable -> createKPropertyType(fir, receiverType, returnTypeRef, candidate) to null diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt index a4d89cf3c6f..3a191e82a4b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt @@ -56,7 +56,7 @@ class IrFunctionReferenceImpl( type, symbol, typeArgumentsCount, - symbol.descriptor.valueParameters.size, + symbol.descriptor.valueParameters.size + symbol.descriptor.contextReceiverParameters.size, reflectionTarget, origin ) diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51247.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51247.kt new file mode 100644 index 00000000000..b85391ff18f --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51247.kt @@ -0,0 +1,55 @@ +//!LANGUAGE: +ContextReceivers +//TARGET_BACKEND: JVM_IR + +interface Context +interface Receiver +interface Param + +fun foo(context: Context, receiver: Receiver, p: Param) {} + +context(Context) +fun bar(receiver: Receiver, p: Param) {} + +context(Context) +fun Receiver.baz(p: Param) {} + + +fun box(): String { + var a: context(Context, Receiver, Param) () -> Unit // 3, 0, 0 + a = ::foo + a = ::bar + a = Receiver::baz + + var b: context(Context, Receiver) Param.() -> Unit // 2, 1, 0 + b = ::foo + b = ::bar + b = Receiver::baz + + var c: context(Context, Receiver) (Param) -> Unit // 2, 0, 1 + c = ::foo + c = ::bar + c = Receiver::baz + + var d: context(Context) Receiver.(Param) -> Unit // 1, 1, 1. This is the same as in KEEP. + d = ::foo + d = ::bar + d = Receiver::baz + + var e: context(Context) (Receiver, Param) -> Unit // 1, 0, 2 + e = ::foo + e = ::bar + e = Receiver::baz + + var f: Context.(Receiver, Param) -> Unit // 0, 1, 2 + f = ::foo + f = ::bar + f = Receiver::baz + + var g: (Context, Receiver, Param) -> Unit // 0, 0, 3 + g = ::foo + g = ::bar + g = Receiver::baz + + return "OK" +} + diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/fromKEEP/functionalType.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/fromKEEP/functionalType.fir.kt deleted file mode 100644 index 218ed960cf5..00000000000 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/fromKEEP/functionalType.fir.kt +++ /dev/null @@ -1,21 +0,0 @@ -// !LANGUAGE: +ContextReceivers -// !DIAGNOSTICS: -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE - -class Context -class Receiver -class Param - -fun foo(context: Context, receiver: Receiver, p: Param) {} - -context(Context) -fun bar(receiver: Receiver, p: Param) {} - -context(Context) -fun Receiver.baz(p: Param) {} - -fun main() { - var g: context(Context) Receiver.(Param) -> Unit - g = ::foo // OK - g = ::bar // OK - g = Receiver::baz // OK -} diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/fromKEEP/functionalType.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/fromKEEP/functionalType.kt index 9380d0c42d7..989af9c1bbe 100644 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/fromKEEP/functionalType.kt +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/fromKEEP/functionalType.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +ContextReceivers // !DIAGNOSTICS: -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE 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 d0da6e4cd05..126b6441fd8 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 @@ -17468,6 +17468,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/iteratorOperator.kt"); } + @Test + @TestMetadata("kt51247.kt") + public void testKt51247() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt51247.kt"); + } + @Test @TestMetadata("kt51284.kt") public void testKt51284() throws Exception {