Fix fun interfaces with extension receivers

#KT-37712 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2020-04-27 04:57:55 +03:00
parent fa50d66afe
commit 780bc1f607
9 changed files with 61 additions and 4 deletions
@@ -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());
@@ -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" }
}
@@ -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");
@@ -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");
@@ -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
}
@@ -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");
@@ -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");