diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index bbb15df8a2d..7329decd8f7 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -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) 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 d332f8c78dc..4e7d1af9718 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 @@ -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( containingClass: IrClass, staticOwner: FirCallableDeclaration ): Boolean { - return !staticOwner.isStatic && + return !staticOwner.isStatic && !containingClass.isFacadeClass && (!containingClass.isObject || containingClass.isCompanion || !staticOwner.hasAnnotation(JVM_STATIC_CLASS_ID)) } 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 ea167a5ea6f..8feb7d2b0cc 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,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, 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 by lazyVar(lock) { + if (containingClass == null) return@lazyVar emptyList() fir.generateOverriddenPropertySymbols( containingClass, session, 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 1972072d0b9..7b08b49f1f2 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 @@ -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(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 by lazyVar(lock) { + if (firParentClass == null) return@lazyVar emptyList() firParentProperty.generateOverriddenAccessorSymbols( firParentClass, !isSetter, 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 29d9914f09f..0f38e17e624 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 @@ -31,7 +31,7 @@ class Fir2IrLazySimpleFunction( endOffset: Int, origin: IrDeclarationOrigin, override val fir: FirSimpleFunction, - firParent: FirRegularClass, + firParent: FirRegularClass?, symbol: Fir2IrSimpleFunctionSymbol, isFakeOverride: Boolean ) : AbstractFir2IrLazyFunction(components, startOffset, endOffset, origin, symbol, isFakeOverride) { @@ -90,6 +90,7 @@ 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(