diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index 08202cad140..280d2ba8c08 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -245,9 +245,9 @@ public class ClosureCodegen extends MemberCodegen { CallableMemberDescriptor.Kind.DECLARATION, descriptor.getSource()); descriptorForBridges - .initialize(null, erasedInterfaceFunction.getDispatchReceiverParameter(), erasedInterfaceFunction.getTypeParameters(), - erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(), - Modality.OPEN, erasedInterfaceFunction.getVisibility()); + .initialize(erasedInterfaceFunction.getExtensionReceiverParameter(), erasedInterfaceFunction.getDispatchReceiverParameter(), + erasedInterfaceFunction.getTypeParameters(), erasedInterfaceFunction.getValueParameters(), + erasedInterfaceFunction.getReturnType(), Modality.OPEN, erasedInterfaceFunction.getVisibility()); descriptorForBridges.setSuspend(descriptor.isSuspend()); diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 12ba48f3799..86ee07e4ca7 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -11102,6 +11102,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/funInterface/funInterfaceInheritance.kt"); } + @TestMetadata("funInterfaceWithReceiver.kt") + public void testFunInterfaceWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt"); + } + @TestMetadata("inlinedSamWrapper.kt") public void testInlinedSamWrapper() throws Exception { runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt"); diff --git a/compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt b/compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt new file mode 100644 index 00000000000..e02a78d5f2a --- /dev/null +++ b/compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt @@ -0,0 +1,24 @@ +// IGNORE_BACKEND_FIR: JVM_IR +// IGNORE_BACKEND: JS_IR + +fun interface FunWithReceiver { + fun String.foo(): String +} + +val prop = FunWithReceiver { this } + +fun bar(s: String, f: FunWithReceiver): String { + return with(f) { + s.foo() + } +} + +fun box(): String { + val r1 = with(prop) { + "OK".foo() + } + + if (r1 != "OK") return "failed 1" + + return bar("O") { this + "K" } +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 2f7d720de00..43096a30d1e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12317,6 +12317,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/funInterface/funInterfaceInheritance.kt"); } + @TestMetadata("funInterfaceWithReceiver.kt") + public void testFunInterfaceWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt"); + } + @TestMetadata("inlinedSamWrapper.kt") public void testInlinedSamWrapper() throws Exception { runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 3b07d2e0f1f..67dc80b06d1 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12317,6 +12317,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/funInterface/castFromAny.kt"); } + @TestMetadata("funInterfaceWithReceiver.kt") + public void testFunInterfaceWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt"); + } + @TestMetadata("inlinedSamWrapper.kt") public void testInlinedSamWrapper() throws Exception { runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 9031d02d036..1c2c52dd654 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11102,6 +11102,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/funInterface/funInterfaceInheritance.kt"); } + @TestMetadata("funInterfaceWithReceiver.kt") + public void testFunInterfaceWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt"); + } + @TestMetadata("inlinedSamWrapper.kt") public void testInlinedSamWrapper() throws Exception { runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt"); 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 dc7c7525204..9498b44e7e8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConversionResolverImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConversionResolverImpl.kt @@ -78,7 +78,10 @@ fun getFunctionTypeForAbstractMethod( var startIndex = 0 var receiverType: KotlinType? = null - if (shouldConvertFirstParameterToDescriptor && function.valueParameters.isNotEmpty()) { + val extensionReceiver = function.extensionReceiverParameter + if (extensionReceiver != null) { + receiverType = extensionReceiver.type + } else if (shouldConvertFirstParameterToDescriptor && function.valueParameters.isNotEmpty()) { receiverType = valueParameters[0].type startIndex = 1 } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 49fcfd98905..39c6d199821 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -9512,6 +9512,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/funInterface/funInterfaceInheritance.kt"); } + @TestMetadata("funInterfaceWithReceiver.kt") + public void testFunInterfaceWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt"); + } + @TestMetadata("inlinedSamWrapper.kt") public void testInlinedSamWrapper() throws Exception { runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 899115be0b6..13eeca8663c 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -9512,6 +9512,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/funInterface/funInterfaceInheritance.kt"); } + @TestMetadata("funInterfaceWithReceiver.kt") + public void testFunInterfaceWithReceiver() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/funInterfaceWithReceiver.kt"); + } + @TestMetadata("inlinedSamWrapper.kt") public void testInlinedSamWrapper() throws Exception { runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");