Fix fun interfaces with extension receivers
#KT-37712 Fixed
This commit is contained in:
@@ -245,9 +245,9 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
|
||||
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());
|
||||
|
||||
|
||||
Generated
+5
@@ -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");
|
||||
|
||||
@@ -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" }
|
||||
}
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Generated
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user