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());
|
CallableMemberDescriptor.Kind.DECLARATION, descriptor.getSource());
|
||||||
|
|
||||||
descriptorForBridges
|
descriptorForBridges
|
||||||
.initialize(null, erasedInterfaceFunction.getDispatchReceiverParameter(), erasedInterfaceFunction.getTypeParameters(),
|
.initialize(erasedInterfaceFunction.getExtensionReceiverParameter(), erasedInterfaceFunction.getDispatchReceiverParameter(),
|
||||||
erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(),
|
erasedInterfaceFunction.getTypeParameters(), erasedInterfaceFunction.getValueParameters(),
|
||||||
Modality.OPEN, erasedInterfaceFunction.getVisibility());
|
erasedInterfaceFunction.getReturnType(), Modality.OPEN, erasedInterfaceFunction.getVisibility());
|
||||||
|
|
||||||
descriptorForBridges.setSuspend(descriptor.isSuspend());
|
descriptorForBridges.setSuspend(descriptor.isSuspend());
|
||||||
|
|
||||||
|
|||||||
Generated
+5
@@ -11102,6 +11102,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/funInterface/funInterfaceInheritance.kt");
|
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")
|
@TestMetadata("inlinedSamWrapper.kt")
|
||||||
public void testInlinedSamWrapper() throws Exception {
|
public void testInlinedSamWrapper() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");
|
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");
|
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")
|
@TestMetadata("inlinedSamWrapper.kt")
|
||||||
public void testInlinedSamWrapper() throws Exception {
|
public void testInlinedSamWrapper() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");
|
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");
|
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")
|
@TestMetadata("inlinedSamWrapper.kt")
|
||||||
public void testInlinedSamWrapper() throws Exception {
|
public void testInlinedSamWrapper() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");
|
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");
|
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")
|
@TestMetadata("inlinedSamWrapper.kt")
|
||||||
public void testInlinedSamWrapper() throws Exception {
|
public void testInlinedSamWrapper() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");
|
runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");
|
||||||
|
|||||||
@@ -78,7 +78,10 @@ fun getFunctionTypeForAbstractMethod(
|
|||||||
|
|
||||||
var startIndex = 0
|
var startIndex = 0
|
||||||
var receiverType: KotlinType? = null
|
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
|
receiverType = valueParameters[0].type
|
||||||
startIndex = 1
|
startIndex = 1
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+5
@@ -9512,6 +9512,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/funInterface/funInterfaceInheritance.kt");
|
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")
|
@TestMetadata("inlinedSamWrapper.kt")
|
||||||
public void testInlinedSamWrapper() throws Exception {
|
public void testInlinedSamWrapper() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");
|
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");
|
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")
|
@TestMetadata("inlinedSamWrapper.kt")
|
||||||
public void testInlinedSamWrapper() throws Exception {
|
public void testInlinedSamWrapper() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");
|
runTest("compiler/testData/codegen/box/funInterface/inlinedSamWrapper.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user