diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt index 57f5f3ad26d..e99004c7e27 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt @@ -934,32 +934,41 @@ class IrBuiltInsOverFir( } if (withGetter) { - property.getter = irFactory.buildFun { - this.name = Name.special("") + property.addGetter { this.returnType = returnType this.modality = modality this.isOperator = false }.also { getter -> getter.addDispatchReceiver { type = this@createProperty.defaultType } - getter.parent = this - getter.correspondingPropertySymbol = property.symbol getter.overriddenSymbols = property.overriddenSymbols.mapNotNull { it.owner.getter?.symbol } } } if (withField || fieldInit != null) { - property.backingField = irFactory.buildField { - this.name = property.name - this.type = defaultType + property.addBackingField { + this.type = returnType + this.isFinal = isConst }.also { if (fieldInit != null) { it.initializer = irFactory.createExpressionBody(0, 0) { expression = fieldInit } } - it.correspondingPropertySymbol = property.symbol } } property.builder() + components.symbolTable.declarePropertyWithSignature( + irSignatureBuilder.computeSignature(property), property.symbol + ) + property.getter?.let { + components.symbolTable.declareSimpleFunctionWithSignature( + irSignatureBuilder.computeSignature(it), it.symbol + ) + } + property.backingField?.let { + components.symbolTable.declareFieldWithSignature( + irSignatureBuilder.computeSignature(it), it.symbol + ) + } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt index 342e1a34bdb..283b4ce3de7 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt @@ -140,6 +140,18 @@ fun IrProperty.addDefaultGetter(parentClass: IrClass, builtIns: IrBuiltIns) { } } +inline fun IrProperty.addBackingField(builder: IrFieldBuilder.() -> Unit = {}): IrField = + IrFieldBuilder().run { + name = this@addBackingField.name + origin = IrDeclarationOrigin.PROPERTY_BACKING_FIELD + builder() + factory.buildField(this).also { field -> + this@addBackingField.backingField = field + field.correspondingPropertySymbol = this@addBackingField.symbol + field.parent = this@addBackingField.parent + } + } + @PublishedApi internal fun IrFactory.buildFunction(builder: IrFunctionBuilder): IrSimpleFunction = with(builder) { createFunction( diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 27e8e1134ee..e825d14d437 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -683,6 +683,10 @@ open class SymbolTable( } } + fun declareFieldWithSignature(sig: IdSignature, symbol: IrFieldSymbol) { + fieldSymbolTable.set(sig, symbol) + } + override fun referenceField(descriptor: PropertyDescriptor): IrFieldSymbol = fieldSymbolTable.referenced(descriptor) { signature -> createFieldSymbol(descriptor, signature) } @@ -760,6 +764,10 @@ open class SymbolTable( } } + fun declarePropertyWithSignature(sig: IdSignature, symbol: IrPropertySymbol) { + propertySymbolTable.set(sig, symbol) + } + override fun referenceProperty(descriptor: PropertyDescriptor): IrPropertySymbol = propertySymbolTable.referenced(descriptor) { signature -> createPropertySymbol(descriptor, signature) }