psi2ir: improve backing field usage generation
Also update corresponding tests data.
This commit is contained in:
+12
@@ -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?,
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user