[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"); 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 @Test
@TestMetadata("genericCollection.kt") @TestMetadata("genericCollection.kt")
public void testGenericCollection() throws Exception { public void testGenericCollection() throws Exception {
@@ -274,7 +274,7 @@ private fun getIdForThisReceiver(
is CallableDescriptor -> { is CallableDescriptor -> {
val receiverParameter = findReceiverByLabelOrGetDefault( val receiverParameter = findReceiverByLabelOrGetDefault(
descriptorOfThisReceiver, descriptorOfThisReceiver,
descriptorOfThisReceiver.extensionReceiverParameter, descriptorOfThisReceiver.extensionReceiverParameter ?: descriptorOfThisReceiver.contextReceiverParameters.firstOrNull(),
bindingContext, bindingContext,
labelName labelName
) )
@@ -146,13 +146,12 @@ class AccessorPropertyLValue(
} }
override fun load(): IrExpression = override fun load(): IrExpression =
// TODO: Use context receiver values callReceiver.adjustForCallee(getterDescriptor!!).call { dispatchReceiverValue, extensionReceiverValue, contextReceiverValues ->
callReceiver.adjustForCallee(getterDescriptor!!).call { dispatchReceiverValue, extensionReceiverValue, _ ->
IrCallImpl( IrCallImpl(
startOffset, endOffset, startOffset, endOffset,
type, type,
getter!!, typeArgumentsCount, getter!!, typeArgumentsCount,
0, contextReceiverValues.size,
origin, origin,
superQualifier superQualifier
).apply { ).apply {
@@ -160,17 +159,19 @@ class AccessorPropertyLValue(
putTypeArguments() putTypeArguments()
dispatchReceiver = dispatchReceiverValue?.load() dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load()
for ((i, contextReceiverValue) in contextReceiverValues.withIndex()) {
putValueArgument(i, contextReceiverValue.load())
}
} }
} }
override fun store(irExpression: IrExpression) = override fun store(irExpression: IrExpression) =
// TODO: Use context receiver values callReceiver.adjustForCallee(setterDescriptor!!).call { dispatchReceiverValue, extensionReceiverValue, contextReceiverValues ->
callReceiver.adjustForCallee(setterDescriptor!!).call { dispatchReceiverValue, extensionReceiverValue, _ ->
IrCallImpl( IrCallImpl(
startOffset, endOffset, startOffset, endOffset,
context.irBuiltIns.unitType, context.irBuiltIns.unitType,
setter!!, typeArgumentsCount, setter!!, typeArgumentsCount,
1, 1 + contextReceiverValues.size,
origin, origin,
superQualifier superQualifier
).apply { ).apply {
@@ -178,7 +179,10 @@ class AccessorPropertyLValue(
putTypeArguments() putTypeArguments()
dispatchReceiver = dispatchReceiverValue?.load() dispatchReceiver = dispatchReceiverValue?.load()
extensionReceiver = extensionReceiverValue?.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"); 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 @Test
@TestMetadata("genericCollection.kt") @TestMetadata("genericCollection.kt")
public void testGenericCollection() throws Exception { public void testGenericCollection() throws Exception {