[PSI2IR] Generate value arguments for context receivers in getter/setter

This commit is contained in:
Anastasiya Shadrina
2021-03-09 19:49:23 +07:00
committed by TeamCityServer
parent 5e426d5c16
commit 766e6bca75
5 changed files with 46 additions and 8 deletions
@@ -15946,6 +15946,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/extensionClasses/constructors.kt");
}
@Test
@TestMetadata("edouble.kt")
public void testEdouble() throws Exception {
runTest("compiler/testData/codegen/box/extensionClasses/edouble.kt");
}
@Test
@TestMetadata("genericCollection.kt")
public void testGenericCollection() throws Exception {
@@ -274,7 +274,7 @@ private fun getIdForThisReceiver(
is CallableDescriptor -> {
val receiverParameter = findReceiverByLabelOrGetDefault(
descriptorOfThisReceiver,
descriptorOfThisReceiver.extensionReceiverParameter,
descriptorOfThisReceiver.extensionReceiverParameter ?: descriptorOfThisReceiver.contextReceiverParameters.firstOrNull(),
bindingContext,
labelName
)
@@ -146,13 +146,12 @@ class AccessorPropertyLValue(
}
override fun load(): IrExpression =
// TODO: Use context receiver values
callReceiver.adjustForCallee(getterDescriptor!!).call { dispatchReceiverValue, extensionReceiverValue, _ ->
callReceiver.adjustForCallee(getterDescriptor!!).call { dispatchReceiverValue, extensionReceiverValue, contextReceiverValues ->
IrCallImpl(
startOffset, endOffset,
type,
getter!!, typeArgumentsCount,
0,
contextReceiverValues.size,
origin,
superQualifier
).apply {
@@ -160,17 +159,19 @@ class AccessorPropertyLValue(
putTypeArguments()
dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load()
for ((i, contextReceiverValue) in contextReceiverValues.withIndex()) {
putValueArgument(i, contextReceiverValue.load())
}
}
}
override fun store(irExpression: IrExpression) =
// TODO: Use context receiver values
callReceiver.adjustForCallee(setterDescriptor!!).call { dispatchReceiverValue, extensionReceiverValue, _ ->
callReceiver.adjustForCallee(setterDescriptor!!).call { dispatchReceiverValue, extensionReceiverValue, contextReceiverValues ->
IrCallImpl(
startOffset, endOffset,
context.irBuiltIns.unitType,
setter!!, typeArgumentsCount,
1,
1 + contextReceiverValues.size,
origin,
superQualifier
).apply {
@@ -178,7 +179,10 @@ class AccessorPropertyLValue(
putTypeArguments()
dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load()
putValueArgument(0, irExpression)
for ((i, contextReceiverValue) in contextReceiverValues.withIndex()) {
putValueArgument(i, contextReceiverValue.load())
}
putValueArgument(contextReceiverValues.size, irExpression)
}
}
@@ -0,0 +1,22 @@
// TARGET_BACKEND: JVM_IR
// IGNORE_BACKEND_FIR: JVM_IR
class EntityContext {
var d = DoubleArray(16)
}
class EDouble(val i: Int) {
context(EntityContext)
var value: Double
get() = d[i]
set(value) { d[i] = value }
}
fun box(): String {
val entityContext = EntityContext()
with(entityContext) {
val eDouble = EDouble(0)
eDouble.value = .2
return if (eDouble.value == .2) "OK" else "fail"
}
}
@@ -15946,6 +15946,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/extensionClasses/constructors.kt");
}
@Test
@TestMetadata("edouble.kt")
public void testEdouble() throws Exception {
runTest("compiler/testData/codegen/box/extensionClasses/edouble.kt");
}
@Test
@TestMetadata("genericCollection.kt")
public void testGenericCollection() throws Exception {