Fir2Ir: use lazy declarations for imported toplevel functions and properties

This commit is contained in:
Georgy Bronnikov
2021-11-30 18:23:20 +03:00
committed by Alexander Udalov
parent c32d0f3852
commit c87748209d
5 changed files with 23 additions and 12 deletions
@@ -715,7 +715,7 @@ class Fir2IrDeclarationStorage(
if (irParent != null) {
parent = irParent
}
if (correspondingProperty is Fir2IrLazyProperty && !isFakeOverride && thisReceiverOwner != null) {
if (correspondingProperty is Fir2IrLazyProperty && correspondingProperty.containingClass != null && !isFakeOverride && thisReceiverOwner != null) {
this.overriddenSymbols = correspondingProperty.fir.generateOverriddenAccessorSymbols(
correspondingProperty.containingClass, !isSetter, session, scopeSession, declarationStorage, fakeOverrideGenerator
)
@@ -1264,12 +1264,13 @@ class Fir2IrDeclarationStorage(
val firFunctionSymbol = fir.symbol
val irFunction = fir.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareSimpleFunction(signature, { symbol }) {
val isFakeOverride = fir.isSubstitutionOrIntersectionOverride &&
val isFakeOverride = firFunctionSymbol is FirNamedFunctionSymbol &&
fir.isSubstitutionOrIntersectionOverride &&
firFunctionSymbol.dispatchReceiverClassOrNull() !=
firFunctionSymbol.originalForSubstitutionOverride?.dispatchReceiverClassOrNull()
Fir2IrLazySimpleFunction(
components, startOffset, endOffset, declarationOrigin,
fir, lazyParent.fir, symbol, isFakeOverride
fir, (lazyParent as? Fir2IrLazyClass)?.fir, symbol, isFakeOverride
).apply {
this.parent = lazyParent
}
@@ -1347,7 +1348,7 @@ class Fir2IrDeclarationStorage(
firPropertySymbol.dispatchReceiverClassOrNull() !=
firPropertySymbol.originalForSubstitutionOverride?.dispatchReceiverClassOrNull()
Fir2IrLazyProperty(
components, startOffset, endOffset, declarationOrigin, fir, lazyParent.fir, symbol, isFakeOverride
components, startOffset, endOffset, declarationOrigin, fir, (lazyParent as? Fir2IrLazyClass)?.fir, symbol, isFakeOverride
).apply {
this.parent = lazyParent
}
@@ -1388,7 +1389,7 @@ class Fir2IrDeclarationStorage(
dispatchReceiverLookupTag: ConeClassLikeLookupTag?,
getCachedIrDeclaration: (firDeclaration: F, dispatchReceiverLookupTag: ConeClassLikeLookupTag?, () -> IdSignature?) -> I?,
createIrDeclaration: (parent: IrDeclarationParent?, origin: IrDeclarationOrigin) -> I,
createIrLazyDeclaration: (signature: IdSignature, lazyOwner: Fir2IrLazyClass, origin: IrDeclarationOrigin) -> I,
createIrLazyDeclaration: (signature: IdSignature, lazyOwner: IrDeclarationParent, origin: IrDeclarationOrigin) -> I,
): IrSymbol {
val fir = firSymbol.fir as F
val irParent by lazy { findIrParent(fir) }
@@ -1424,6 +1425,11 @@ class Fir2IrDeclarationStorage(
}
}
}
is IrExternalPackageFragment -> {
signature?.let {
return createIrLazyDeclaration(it, parent, declarationOrigin).symbol
}
}
}
return createIrDeclaration(irParent, declarationOrigin).apply {
(this as IrDeclaration).setAndModifyParent(irParent)
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.ir.util.isFacadeClass
import org.jetbrains.kotlin.ir.util.isObject
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
@@ -89,7 +90,7 @@ abstract class AbstractFir2IrLazyFunction<F : FirCallableDeclaration>(
containingClass: IrClass,
staticOwner: FirCallableDeclaration
): Boolean {
return !staticOwner.isStatic &&
return !staticOwner.isStatic && !containingClass.isFacadeClass &&
(!containingClass.isObject || containingClass.isCompanion || !staticOwner.hasAnnotation(JVM_STATIC_CLASS_ID))
}
@@ -39,7 +39,7 @@ class Fir2IrLazyProperty(
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val fir: FirProperty,
internal val containingClass: FirRegularClass,
internal val containingClass: FirRegularClass?,
override val symbol: Fir2IrPropertySymbol,
override val isFakeOverride: Boolean
) : IrProperty(), AbstractFir2IrLazyDeclaration<FirProperty, IrProperty>, Fir2IrComponents by components {
@@ -171,7 +171,7 @@ class Fir2IrLazyProperty(
},
fir.getter, isSetter = false, fir, containingClass,
Fir2IrSimpleFunctionSymbol(
signatureComposer.composeAccessorSignature(fir, isSetter = false, containingClass.symbol.toLookupTag())!!
signatureComposer.composeAccessorSignature(fir, isSetter = false, containingClass?.symbol?.toLookupTag())!!
),
isFakeOverride
).apply {
@@ -199,7 +199,7 @@ class Fir2IrLazyProperty(
},
fir.setter, isSetter = true, fir, containingClass,
Fir2IrSimpleFunctionSymbol(
signatureComposer.composeAccessorSignature(fir, isSetter = true, containingClass.symbol.toLookupTag())!!
signatureComposer.composeAccessorSignature(fir, isSetter = true, containingClass?.symbol?.toLookupTag())!!
),
isFakeOverride
).apply {
@@ -217,6 +217,7 @@ class Fir2IrLazyProperty(
}
override var overriddenSymbols: List<IrPropertySymbol> by lazyVar(lock) {
if (containingClass == null) return@lazyVar emptyList()
fir.generateOverriddenPropertySymbols(
containingClass,
session,
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.isFacadeClass
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
@@ -32,7 +33,7 @@ class Fir2IrLazyPropertyAccessor(
private val firAccessor: FirPropertyAccessor?,
private val isSetter: Boolean,
private val firParentProperty: FirProperty,
firParentClass: FirRegularClass,
firParentClass: FirRegularClass?,
symbol: Fir2IrSimpleFunctionSymbol,
isFakeOverride: Boolean
) : AbstractFir2IrLazyFunction<FirCallableDeclaration>(components, startOffset, endOffset, origin, symbol, isFakeOverride) {
@@ -60,7 +61,7 @@ class Fir2IrLazyPropertyAccessor(
}
override var dispatchReceiverParameter: IrValueParameter? by lazyVar(lock) {
val containingClass = parent as? IrClass
val containingClass = (parent as? IrClass)?.takeUnless { it.isFacadeClass }
if (containingClass != null && shouldHaveDispatchReceiver(containingClass, firParentProperty)
) {
createThisReceiverParameter(thisType = containingClass.thisReceiver?.type ?: error("No this receiver for containing class"))
@@ -105,6 +106,7 @@ class Fir2IrLazyPropertyAccessor(
}
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar(lock) {
if (firParentClass == null) return@lazyVar emptyList()
firParentProperty.generateOverriddenAccessorSymbols(
firParentClass,
!isSetter,
@@ -31,7 +31,7 @@ class Fir2IrLazySimpleFunction(
endOffset: Int,
origin: IrDeclarationOrigin,
override val fir: FirSimpleFunction,
firParent: FirRegularClass,
firParent: FirRegularClass?,
symbol: Fir2IrSimpleFunctionSymbol,
isFakeOverride: Boolean
) : AbstractFir2IrLazyFunction<FirSimpleFunction>(components, startOffset, endOffset, origin, symbol, isFakeOverride) {
@@ -90,6 +90,7 @@ class Fir2IrLazySimpleFunction(
}
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar(lock) {
if (firParent == null) return@lazyVar emptyList()
val parent = parent
if (isFakeOverride && parent is Fir2IrLazyClass) {
fakeOverrideGenerator.calcBaseSymbolsForFakeOverrideFunction(