[PSI2IR] Do not create property descriptors during IR generation
This commit is contained in:
committed by
TeamCityServer
parent
1357f28be6
commit
6d1e5637a7
+1
-1
@@ -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
|
||||
|
||||
+10
-26
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -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")
|
||||
}
|
||||
Reference in New Issue
Block a user