From 766e6bca75459d33c423ad9bbbcce2d46b628ba3 Mon Sep 17 00:00:00 2001 From: Anastasiya Shadrina Date: Tue, 9 Mar 2021 19:49:23 +0700 Subject: [PATCH] [PSI2IR] Generate value arguments for context receivers in getter/setter --- .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ .../calls/smartcasts/IdentifierInfo.kt | 2 +- .../psi2ir/intermediate/PropertyLValue.kt | 18 +++++++++------ .../codegen/box/extensionClasses/edouble.kt | 22 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ 5 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/box/extensionClasses/edouble.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 4bc2b72f900..3dc226daff1 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -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 { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo.kt index ab01f6198f2..784c4b6a946 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo.kt @@ -274,7 +274,7 @@ private fun getIdForThisReceiver( is CallableDescriptor -> { val receiverParameter = findReceiverByLabelOrGetDefault( descriptorOfThisReceiver, - descriptorOfThisReceiver.extensionReceiverParameter, + descriptorOfThisReceiver.extensionReceiverParameter ?: descriptorOfThisReceiver.contextReceiverParameters.firstOrNull(), bindingContext, labelName ) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt index ceade335154..6790c856e76 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt @@ -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) } } diff --git a/compiler/testData/codegen/box/extensionClasses/edouble.kt b/compiler/testData/codegen/box/extensionClasses/edouble.kt new file mode 100644 index 00000000000..4d3fc7fbee4 --- /dev/null +++ b/compiler/testData/codegen/box/extensionClasses/edouble.kt @@ -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" + } +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index c8be44b6215..c87cf36f7ff 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -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 {