[PSI2IR] Do not create property descriptors during IR generation

This commit is contained in:
Anastasiya Shadrina
2021-09-27 19:20:40 +07:00
committed by TeamCityServer
parent 1357f28be6
commit 6d1e5637a7
4 changed files with 20 additions and 36 deletions
@@ -131,7 +131,7 @@ fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffse
)
IrGetFieldImpl(
defaultStartOffset, defaultEndOffset,
context.symbolTable.referenceField(context.additionalDescriptorStorage.getField(receiver)),
context.additionalDescriptorStorage.getSyntheticField(receiver).symbol,
irReceiverType, thisReceiver
)
}
@@ -350,7 +350,7 @@ class BodyGenerator(
irBlockBody.statements.add(
IrSetFieldImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
context.symbolTable.referenceField(context.additionalDescriptorStorage.getField(receiverDescriptor.value)),
context.additionalDescriptorStorage.getSyntheticField(receiverDescriptor.value).symbol,
receiver,
IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irValueParameter.type, irValueParameter.symbol),
context.irBuiltIns.unitType
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.expressions.mapValueParameters
import org.jetbrains.kotlin.ir.expressions.putTypeArguments
import org.jetbrains.kotlin.ir.expressions.typeParametersCount
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
import org.jetbrains.kotlin.ir.util.createIrClassFromDescriptor
@@ -435,35 +436,18 @@ class ClassGenerator(
private fun generateFieldsForAdditionalReceivers(irClass: IrClass, classDescriptor: ClassDescriptor) {
for ((fieldIndex, receiverDescriptor) in classDescriptor.contextReceivers.withIndex()) {
val descriptor = PropertyDescriptorImpl.create(
classDescriptor,
Annotations.EMPTY,
Modality.FINAL,
DescriptorVisibilities.DEFAULT_VISIBILITY,
false,
Name.identifier("additionalReceiverField$fieldIndex"),
CallableMemberDescriptor.Kind.DECLARATION,
SourceElement.NO_SOURCE,
false, false,
classDescriptor.isExpect,
false, false, false
)
descriptor.setType(
receiverDescriptor.type, emptyList(), DescriptorUtils.getDispatchReceiverParameterIfNeeded(classDescriptor), null,
emptyList()
)
descriptor.initialize(
null, null,
FieldDescriptorImpl(Annotations.EMPTY, descriptor),
null
)
context.additionalDescriptorStorage.put(receiverDescriptor.value, descriptor)
val irField = context.symbolTable.declareField(
val irField = context.irFactory.createField(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER,
descriptor, descriptor.type.toIrType(),
descriptor.visibility
IrFieldSymbolImpl(),
Name.identifier("additionalReceiverField$fieldIndex"),
receiverDescriptor.type.toIrType(),
DescriptorVisibilities.PRIVATE,
isFinal = true,
isExternal = false,
isStatic = false
)
context.additionalDescriptorStorage.put(receiverDescriptor.value, irField)
irClass.addMember(irField)
}
}
@@ -5,25 +5,25 @@
package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
class DescriptorStorageForAdditionalReceivers {
private val fieldStorage: MutableMap<ReceiverValue, PropertyDescriptor> = mutableMapOf()
private val variableStorage: MutableMap<KtExpression, VariableDescriptor> = mutableMapOf()
fun put(receiverValue: ReceiverValue, descriptor: PropertyDescriptor) {
fieldStorage[receiverValue] = descriptor
}
private val syntheticFieldStorage: MutableMap<ReceiverValue, IrField> = mutableMapOf()
fun put(expression: KtExpression, descriptor: VariableDescriptor) {
variableStorage[expression] = descriptor
}
fun getField(receiverValue: ReceiverValue) =
fieldStorage[receiverValue] ?: error("No field descriptor for receiver value $receiverValue")
fun put(receiverValue: ReceiverValue, irField: IrField) {
syntheticFieldStorage[receiverValue] = irField
}
fun getVariable(expression: KtExpression) = variableStorage[expression] ?: error("No variable descriptor for receiver $expression")
fun getSyntheticField(receiverValue: ReceiverValue) =
syntheticFieldStorage[receiverValue] ?: error("No synthetic field for receiver value $receiverValue")
}