From 4c3fb9a21f0233ef73b2c0c918c4cd8429230947 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Tue, 10 Jan 2017 11:23:15 +0700 Subject: [PATCH] psi2ir: improve backing field usage generation Also update corresponding tests data. --- .../psi2ir/generators/ArgumentsGenerationUtils.kt | 12 ++++++++++++ .../kotlin/psi2ir/generators/AssignmentGenerator.kt | 5 ++--- .../kotlin/psi2ir/generators/StatementGenerator.kt | 5 +++++ compiler/testData/ir/irText/classes/initVar.txt | 3 +++ .../ir/irText/declarations/classLevelProperties.txt | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt index 0355655ba14..9467e8abdcb 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpressionWithCopy import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl @@ -86,6 +87,17 @@ private fun generateThisOrSuperReceiver(receiver: ReceiverValue, classDescriptor return IrGetValueImpl(ktReceiver.startOffset, ktReceiver.endOffset, classDescriptor.thisAsReceiverParameter) } +fun StatementGenerator.generateBackingFieldReceiver( + ktDefaultElement: KtElement, + resolvedCall: ResolvedCall<*>?, + fieldDescriptor: SyntheticFieldDescriptor +): IntermediateValue? { + + val receiver = resolvedCall?.dispatchReceiver ?: fieldDescriptor.getDispatchReceiverForBackend() ?: return null + + return this.generateReceiver(ktDefaultElement, receiver) +} + fun StatementGenerator.generateCallReceiver( ktDefaultElement: KtElement, dispatchReceiver: ReceiverValue?, diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt index 47f1856c28f..102b6084f26 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt @@ -110,9 +110,8 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen return when (descriptor) { is SyntheticFieldDescriptor -> { - val receiverValue = resolvedCall.dispatchReceiver?.let { - statementGenerator.generateReceiver(ktLeft, it) - } + val receiverValue = statementGenerator.generateBackingFieldReceiver(ktLeft, resolvedCall, descriptor) + BackingFieldLValue(ktLeft.startOffset, ktLeft.endOffset, descriptor.propertyDescriptor, receiverValue, origin) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt index 5872b15fcda..7d08ad0db12 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.assertCast import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin @@ -277,6 +278,10 @@ class StatementGenerator( is PropertyDescriptor -> { CallGenerator(this).generateCall(expression.startOffset, expression.endOffset, pregenerateCall(resolvedCall!!)) } + is SyntheticFieldDescriptor -> { + val receiver = generateBackingFieldReceiver(expression, resolvedCall, descriptor) + IrGetFieldImpl(expression.startOffset, expression.endOffset, descriptor.propertyDescriptor, receiver?.load()) + } is VariableDescriptor -> CallGenerator(this).generateGetVariable(expression.startOffset, expression.endOffset, descriptor, getTypeArguments(resolvedCall)) diff --git a/compiler/testData/ir/irText/classes/initVar.txt b/compiler/testData/ir/irText/classes/initVar.txt index f5902852114..40c7d6b1e4e 100644 --- a/compiler/testData/ir/irText/classes/initVar.txt +++ b/compiler/testData/ir/irText/classes/initVar.txt @@ -76,6 +76,7 @@ FILE /initVar.kt FUN public final fun (value: kotlin.Int): kotlin.Unit BLOCK_BODY SET_FIELD 'x: Int' type=kotlin.Unit origin=EQ + receiver: GET_VAR '' type=TestInitVarWithCustomSetter origin=null value: GET_VAR 'value-parameter value: Int' type=kotlin.Int origin=null CLASS CLASS TestInitVarWithCustomSetterWithExplicitCtor PROPERTY public final var x: kotlin.Int @@ -88,6 +89,7 @@ FILE /initVar.kt FUN public final fun (value: kotlin.Int): kotlin.Unit BLOCK_BODY SET_FIELD 'x: Int' type=kotlin.Unit origin=EQ + receiver: GET_VAR '' type=TestInitVarWithCustomSetterWithExplicitCtor origin=null value: GET_VAR 'value-parameter value: Int' type=kotlin.Int origin=null ANONYMOUS_INITIALIZER TestInitVarWithCustomSetterWithExplicitCtor BLOCK_BODY @@ -109,6 +111,7 @@ FILE /initVar.kt FUN public final fun (value: kotlin.Int): kotlin.Unit BLOCK_BODY SET_FIELD 'x: Int' type=kotlin.Unit origin=EQ + receiver: GET_VAR '' type=TestInitVarWithCustomSetterInCtor origin=null value: GET_VAR 'value-parameter value: Int' type=kotlin.Int origin=null CONSTRUCTOR public constructor TestInitVarWithCustomSetterInCtor() BLOCK_BODY diff --git a/compiler/testData/ir/irText/declarations/classLevelProperties.txt b/compiler/testData/ir/irText/declarations/classLevelProperties.txt index f97f03cda71..77405d4a259 100644 --- a/compiler/testData/ir/irText/declarations/classLevelProperties.txt +++ b/compiler/testData/ir/irText/declarations/classLevelProperties.txt @@ -44,6 +44,7 @@ FILE /classLevelProperties.kt FUN public final fun (value: kotlin.Int): kotlin.Unit BLOCK_BODY SET_FIELD 'test4: Int' type=kotlin.Unit origin=EQ + receiver: GET_VAR '' type=C origin=null value: GET_VAR 'value-parameter value: Int' type=kotlin.Int origin=null PROPERTY public final var test5: kotlin.Int FIELD PROPERTY_BACKING_FIELD public final var test5: kotlin.Int