[PSI2IR] Generate value arguments for context receivers in getter/setter
This commit is contained in:
committed by
TeamCityServer
parent
5e426d5c16
commit
766e6bca75
+6
@@ -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 {
|
||||
|
||||
+1
-1
@@ -274,7 +274,7 @@ private fun getIdForThisReceiver(
|
||||
is CallableDescriptor -> {
|
||||
val receiverParameter = findReceiverByLabelOrGetDefault(
|
||||
descriptorOfThisReceiver,
|
||||
descriptorOfThisReceiver.extensionReceiverParameter,
|
||||
descriptorOfThisReceiver.extensionReceiverParameter ?: descriptorOfThisReceiver.contextReceiverParameters.firstOrNull(),
|
||||
bindingContext,
|
||||
labelName
|
||||
)
|
||||
|
||||
+11
-7
@@ -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"
|
||||
}
|
||||
}
|
||||
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user