diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 8cef8b6556e..96cb046c69e 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -92,7 +92,7 @@ class CallAndReferenceGenerator( getter = referencedPropertyGetter?.symbol, setter = referencedPropertySetterSymbol, origin = origin - ) + ).applyTypeArguments(callableReferenceAccess).applyReceivers(callableReferenceAccess, explicitReceiverExpression) } is IrLocalDelegatedPropertySymbol -> { IrLocalDelegatedPropertyReferenceImpl( @@ -122,7 +122,7 @@ class CallAndReferenceGenerator( getter = if (referencedField.isStatic) null else propertySymbol.owner.getter?.symbol, setter = if (referencedField.isStatic) null else propertySymbol.owner.setter?.symbol, origin - ) + ).applyReceivers(callableReferenceAccess, explicitReceiverExpression) } is IrFunctionSymbol -> { assert(type.isFunctionTypeOrSubtype()) { @@ -131,6 +131,7 @@ class CallAndReferenceGenerator( type as IrSimpleType val function = symbol.owner if (adapterGenerator.needToGenerateAdaptedCallableReference(callableReferenceAccess, type, function)) { + // Receivers are being applied inside with(adapterGenerator) { val adaptedType = callableReferenceAccess.typeRef.coneType.kFunctionTypeToFunctionType() generateAdaptedCallableReference(callableReferenceAccess, explicitReceiverExpression, symbol, adaptedType) @@ -144,7 +145,8 @@ class CallAndReferenceGenerator( typeArgumentsCount = typeArgumentCount, valueArgumentsCount = function.valueParameters.size, reflectionTarget = symbol - ) + ).applyTypeArguments(callableReferenceAccess) + .applyReceivers(callableReferenceAccess, explicitReceiverExpression) } } else -> { @@ -153,7 +155,7 @@ class CallAndReferenceGenerator( ) } } - }.applyTypeArguments(callableReferenceAccess).applyReceivers(callableReferenceAccess, explicitReceiverExpression) + } } private fun computeFieldSymbolForCallableReference( 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 ae0eaa5c9b3..c2da673ff7c 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 @@ -2695,6 +2695,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt"); } + @Test + @TestMetadata("withReceiver.kt") + public void testWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/testData/codegen/box/callableReference/adaptedReferences/adaptedVarargFunImportedFromObject.kt b/compiler/testData/codegen/box/callableReference/adaptedReferences/adaptedVarargFunImportedFromObject.kt index 79d567ef63a..6a61b65f2cf 100644 --- a/compiler/testData/codegen/box/callableReference/adaptedReferences/adaptedVarargFunImportedFromObject.kt +++ b/compiler/testData/codegen/box/callableReference/adaptedReferences/adaptedVarargFunImportedFromObject.kt @@ -1,6 +1,5 @@ // DONT_TARGET_EXACT_BACKEND: WASM // WASM_MUTE_REASON: BINDING_RECEIVERS -// IGNORE_BACKEND_FIR: JVM_IR import Host.foo diff --git a/compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt b/compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt new file mode 100644 index 00000000000..26dbfbcc7bc --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt @@ -0,0 +1,10 @@ +// TARGET_BACKEND: JVM +// FULL_JDK +// WITH_RUNTIME + +fun MutableSet.foo(s: CharSequence): Set { + s.also(::add) + return this +} + +fun box(): String = mutableSetOf().foo("OK").single() as String diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index a0c25692a02..800df5cf850 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -2695,6 +2695,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt"); } + @Test + @TestMetadata("withReceiver.kt") + public void testWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion") @TestDataPath("$PROJECT_ROOT") 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 c11e0df58e6..96ac9cb16c8 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 @@ -2695,6 +2695,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt"); } + @Test + @TestMetadata("withReceiver.kt") + public void testWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 71ec4448156..cf30c8dcfc8 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2362,6 +2362,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt"); } + @TestMetadata("withReceiver.kt") + public void testWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt"); + } + @TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)