Fir2Ir: use lazy declarations for imported toplevel functions and properties
This commit is contained in:
committed by
Alexander Udalov
parent
c32d0f3852
commit
c87748209d
+11
-5
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user