From f0f8a9728ef7b538cd51661584925b5ab6843090 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 14 Nov 2023 15:49:35 +0200 Subject: [PATCH] [FIR2IR] Make parent of lazy declaration non-lateinit There is no actual sense to have parent as a lateinit var, because in all places it is initialized right after declaration creation --- .../Fir2IrLazyDeclarationsGenerator.kt | 17 +++----- .../fir/lazy/AbstractFir2IrLazyFunction.kt | 2 +- .../kotlin/fir/lazy/Fir2IrLazyClass.kt | 2 +- .../kotlin/fir/lazy/Fir2IrLazyConstructor.kt | 2 +- .../kotlin/fir/lazy/Fir2IrLazyProperty.kt | 43 +++++++++++-------- .../fir/lazy/Fir2IrLazyPropertyAccessor.kt | 8 ++-- .../fir/lazy/Fir2IrLazySimpleFunction.kt | 9 ++-- 7 files changed, 40 insertions(+), 43 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrLazyDeclarationsGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrLazyDeclarationsGenerator.kt index b33b2b125d9..8e2a1fabff3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrLazyDeclarationsGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrLazyDeclarationsGenerator.kt @@ -30,9 +30,8 @@ class Fir2IrLazyDeclarationsGenerator(val components: Fir2IrComponents) : Fir2Ir val isFakeOverride = fir.isFakeOverride(firContainingClass) Fir2IrLazySimpleFunction( components, startOffset, endOffset, declarationOrigin, - fir, firContainingClass, symbol, isFakeOverride + fir, firContainingClass, symbol, lazyParent, isFakeOverride ).apply { - this.parent = lazyParent prepareTypeParameters() } } @@ -54,10 +53,8 @@ class Fir2IrLazyDeclarationsGenerator(val components: Fir2IrComponents) : Fir2Ir val originForProperty = if (isPropertyForField) IrDeclarationOrigin.DEFINED else declarationOrigin return fir.convertWithOffsets { startOffset, endOffset -> Fir2IrLazyProperty( - components, startOffset, endOffset, originForProperty, fir, firContainingClass, symbols, isFakeOverride - ).apply { - this.parent = lazyParent - } + components, startOffset, endOffset, originForProperty, fir, firContainingClass, symbols, lazyParent, isFakeOverride + ) } } @@ -67,9 +64,7 @@ class Fir2IrLazyDeclarationsGenerator(val components: Fir2IrComponents) : Fir2Ir declarationOrigin: IrDeclarationOrigin, lazyParent: IrDeclarationParent, ): IrConstructor = fir.convertWithOffsets { startOffset, endOffset -> - Fir2IrLazyConstructor(components, startOffset, endOffset, declarationOrigin, fir, symbol).apply { - parent = lazyParent - } + Fir2IrLazyConstructor(components, startOffset, endOffset, declarationOrigin, fir, symbol, lazyParent) } fun createIrLazyClass( @@ -78,9 +73,7 @@ class Fir2IrLazyDeclarationsGenerator(val components: Fir2IrComponents) : Fir2Ir symbol: IrClassSymbol ): Fir2IrLazyClass = firClass.convertWithOffsets { startOffset, endOffset -> val firClassOrigin = firClass.irOrigin(session.firProvider) - Fir2IrLazyClass(components, startOffset, endOffset, firClassOrigin, firClass, symbol).apply { - parent = irParent - } + Fir2IrLazyClass(components, startOffset, endOffset, firClassOrigin, firClass, symbol, irParent) } fun createIrLazyField( diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt index 52bd58f3ff5..c5063571088 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt @@ -37,12 +37,12 @@ abstract class AbstractFir2IrLazyFunction( override val endOffset: Int, override var origin: IrDeclarationOrigin, override val symbol: IrSimpleFunctionSymbol, + override var parent: IrDeclarationParent, override var isFakeOverride: Boolean ) : AbstractIrLazyFunction(), AbstractFir2IrLazyDeclaration, Fir2IrTypeParametersContainer, IrLazyFunctionBase, Fir2IrComponents by components { override lateinit var typeParameters: List - override lateinit var parent: IrDeclarationParent override var isTailrec: Boolean get() = fir.isTailRec diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index 27b1f954f49..d8c34d6154b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -40,6 +40,7 @@ class Fir2IrLazyClass( override var origin: IrDeclarationOrigin, override val fir: FirRegularClass, override val symbol: IrClassSymbol, + override var parent: IrDeclarationParent, ) : IrClass(), AbstractFir2IrLazyDeclaration, Fir2IrTypeParametersContainer, IrMaybeDeserializedClass, DeserializableClass, Fir2IrComponents by components { init { @@ -49,7 +50,6 @@ class Fir2IrLazyClass( override var annotations: List by createLazyAnnotations() override lateinit var typeParameters: List - override lateinit var parent: IrDeclarationParent override val source: SourceElement get() = fir.sourceElement ?: SourceElement.NO_SOURCE diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt index a5aee480df6..9c3e0d23f19 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt @@ -36,6 +36,7 @@ class Fir2IrLazyConstructor( override var origin: IrDeclarationOrigin, override val fir: FirConstructor, override val symbol: IrConstructorSymbol, + override var parent: IrDeclarationParent ) : IrConstructor(), AbstractFir2IrLazyDeclaration, Fir2IrTypeParametersContainer, Fir2IrComponents by components { init { @@ -45,7 +46,6 @@ class Fir2IrLazyConstructor( override var annotations: List by createLazyAnnotations() override lateinit var typeParameters: List - override lateinit var parent: IrDeclarationParent override var isPrimary: Boolean get() = fir.isPrimary diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt index 7a6c18bf9ae..2a68f08da1f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt @@ -39,6 +39,7 @@ class Fir2IrLazyProperty( override val fir: FirProperty, val containingClass: FirRegularClass?, symbols: PropertySymbols, + override var parent: IrDeclarationParent, override var isFakeOverride: Boolean ) : IrProperty(), AbstractFir2IrLazyDeclaration, Fir2IrComponents by components { override val symbol: IrPropertySymbol = symbols.propertySymbol @@ -49,7 +50,6 @@ class Fir2IrLazyProperty( } override var annotations: List by createLazyAnnotations() - override lateinit var parent: IrDeclarationParent @ObsoleteDescriptorBasedAPI override val descriptor: PropertyDescriptor @@ -172,18 +172,23 @@ class Fir2IrLazyProperty( override var getter: IrSimpleFunction? by lazyVar(lock) { Fir2IrLazyPropertyAccessor( components, startOffset, endOffset, - when { - origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin - fir.delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR - origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin - origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin - fir.getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR - else -> origin - }, - fir.getter, isSetter = false, fir, containingClass, symbols.getterSymbol, isFakeOverride, this.symbol - ).apply { - parent = this@Fir2IrLazyProperty.parent - correspondingPropertySymbol = this@Fir2IrLazyProperty.symbol + origin = when { + origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin + fir.delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR + origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin + origin == IrDeclarationOrigin.DELEGATED_MEMBER -> origin + fir.getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR + else -> origin + }, + firAccessor = fir.getter, + isSetter = false, + firParentProperty = fir, + firParentClass = containingClass, + symbol = symbols.getterSymbol, + parent = this@Fir2IrLazyProperty.parent, + isFakeOverride = isFakeOverride, + correspondingPropertySymbol = this.symbol + ).apply { classifiersGenerator.setTypeParameters(this, this@Fir2IrLazyProperty.fir, ConversionTypeOrigin.DEFAULT) } } @@ -192,7 +197,7 @@ class Fir2IrLazyProperty( if (!fir.isVar) return@lazyVar null Fir2IrLazyPropertyAccessor( components, startOffset, endOffset, - when { + origin = when { origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin fir.delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR origin == IrDeclarationOrigin.FAKE_OVERRIDE -> origin @@ -200,10 +205,14 @@ class Fir2IrLazyProperty( fir.setter is FirDefaultPropertySetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR else -> origin }, - fir.setter, isSetter = true, fir, containingClass, symbols.setterSymbol!!, isFakeOverride, this.symbol + firAccessor = fir.setter, isSetter = true, + firParentProperty = fir, + firParentClass = containingClass, + symbol = symbols.setterSymbol!!, + parent = this@Fir2IrLazyProperty.parent, + isFakeOverride = isFakeOverride, + correspondingPropertySymbol = this.symbol ).apply { - parent = this@Fir2IrLazyProperty.parent - correspondingPropertySymbol = this@Fir2IrLazyProperty.symbol classifiersGenerator.setTypeParameters(this, this@Fir2IrLazyProperty.fir, ConversionTypeOrigin.SETTER) } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt index bda10c78b7d..5a0de8dd864 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt @@ -12,10 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.isInline -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrValueParameter +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol @@ -37,9 +34,10 @@ class Fir2IrLazyPropertyAccessor( private val firParentProperty: FirProperty, firParentClass: FirRegularClass?, symbol: IrSimpleFunctionSymbol, + parent: IrDeclarationParent, isFakeOverride: Boolean, override var correspondingPropertySymbol: IrPropertySymbol? -) : AbstractFir2IrLazyFunction(components, startOffset, endOffset, origin, symbol, isFakeOverride) { +) : AbstractFir2IrLazyFunction(components, startOffset, endOffset, origin, symbol, parent, isFakeOverride) { init { symbol.bind(this) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt index c2b9fab9be0..9a9542b30a0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt @@ -14,10 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.initialSignatureAttr -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrValueParameter +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol @@ -35,8 +32,9 @@ class Fir2IrLazySimpleFunction( override val fir: FirSimpleFunction, firParent: FirRegularClass?, symbol: IrSimpleFunctionSymbol, + parent: IrDeclarationParent, isFakeOverride: Boolean -) : AbstractFir2IrLazyFunction(components, startOffset, endOffset, origin, symbol, isFakeOverride) { +) : AbstractFir2IrLazyFunction(components, startOffset, endOffset, origin, symbol, parent, isFakeOverride) { init { symbol.bind(this) classifierStorage.preCacheTypeParameters(fir, symbol) @@ -96,7 +94,6 @@ class Fir2IrLazySimpleFunction( override var overriddenSymbols: List by lazyVar(lock) { if (firParent == null) return@lazyVar emptyList() - val parent = parent if (isFakeOverride && parent is Fir2IrLazyClass) { fakeOverrideGenerator.calcBaseSymbolsForFakeOverrideFunction( firParent, this, fir.symbol