Fix codegen for context-receiver contained super class constructor calls

^KT-51889 In Progress
This commit is contained in:
Denis.Zharkov
2022-04-29 18:15:07 +03:00
committed by teamcity
parent e39fb807a7
commit 81416d1c46
4 changed files with 37 additions and 7 deletions
@@ -16752,6 +16752,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/simpleCall.kt");
}
@Test
@TestMetadata("superClassAndSubClassWithContextReceiver.kt")
public void testSuperClassAndSubClassWithContextReceiver() throws Exception {
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/superClassAndSubClassWithContextReceiver.kt");
}
@Test
@TestMetadata("suspendContextualWithExtension.kt")
public void testSuspendContextualWithExtension() throws Exception {
@@ -34,10 +34,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtConstructorDelegationCall
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.ValueArgument
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.intermediate.*
@@ -264,10 +261,12 @@ fun StatementGenerator.generateCallReceiver(
else -> {
dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, dispatchReceiver)
extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver)
contextReceiverValues = if (ktDefaultElement is KtConstructorDelegationCall) contextReceivers.mapNotNull {
generateContextReceiverForDelegatingConstructorCall(ktDefaultElement, it as ContextClassReceiver)
contextReceiverValues = when (ktDefaultElement) {
is KtConstructorDelegationCall, is KtSuperTypeCallEntry -> contextReceivers.mapNotNull {
generateContextReceiverForDelegatingConstructorCall(ktDefaultElement, it as ContextClassReceiver)
}
else -> contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) }
}
else contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) }
}
}
@@ -0,0 +1,19 @@
// !LANGUAGE: +ContextReceivers
// TARGET_BACKEND: JVM_IR
// IGNORE_BACKEND_FIR: JVM_IR
class Components(val x: String)
context(Components)
abstract class A {
fun foo(): String = x
}
context(Components)
class B : A()
fun box(): String {
return with(Components("OK")) {
B().foo()
}
}
@@ -16752,6 +16752,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/simpleCall.kt");
}
@Test
@TestMetadata("superClassAndSubClassWithContextReceiver.kt")
public void testSuperClassAndSubClassWithContextReceiver() throws Exception {
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/superClassAndSubClassWithContextReceiver.kt");
}
@Test
@TestMetadata("suspendContextualWithExtension.kt")
public void testSuspendContextualWithExtension() throws Exception {