[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");
|
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 {
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
+11
-7
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user