diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt index e91239db2be..c79ca87d47f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt @@ -77,7 +77,7 @@ internal object FirReferenceResolveHelper { val callee = calleeReference.resolvedSymbol.fir as? FirCallableDeclaration // TODO: check callee owner directly? if (callee !is FirConstructor && callee?.isStatic != true) { - classLikeDeclaration.companionObject?.let { return it.buildSymbol(symbolBuilder) } + classLikeDeclaration.companionObjectSymbol?.let { return it.fir.buildSymbol(symbolBuilder) } } } } @@ -398,7 +398,7 @@ internal object FirReferenceResolveHelper { symbolBuilder: KtSymbolByFirBuilder ): Collection { val referencedSymbol = if (fir.resolvedToCompanionObject) { - (fir.symbol?.fir as? FirRegularClass)?.companionObject?.symbol + (fir.symbol?.fir as? FirRegularClass)?.companionObjectSymbol } else { fir.symbol } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index 5c0759374fa..4af06e5def6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -73,7 +73,7 @@ internal class KtFirNamedClassOrObjectSymbol( override val isExternal: Boolean get() = firRef.withFir { it.isExternal } override val companionObject: KtFirNamedClassOrObjectSymbol? by firRef.withFirAndCache { fir -> - fir.companionObject?.let { builder.classifierBuilder.buildNamedClassOrObjectSymbol(it) } + fir.companionObjectSymbol?.let { builder.classifierBuilder.buildNamedClassOrObjectSymbol(it.fir) } } override val superTypes: List by cached { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumCompanionInEnumConstructorCallChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumCompanionInEnumConstructorCallChecker.kt index 94bdd567e6f..889329f5714 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumCompanionInEnumConstructorCallChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumCompanionInEnumConstructorCallChecker.kt @@ -18,14 +18,13 @@ import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid -import org.jetbrains.kotlin.fir.visitors.acceptAllElements import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull object FirEnumCompanionInEnumConstructorCallChecker : FirEnumEntryChecker() { override fun check(declaration: FirEnumEntry, context: CheckerContext, reporter: DiagnosticReporter) { val enumClass = context.containingDeclarations.lastIsInstanceOrNull() ?: return if (enumClass.classKind != ClassKind.ENUM_CLASS) return - val companionOfEnumSymbol = enumClass.companionObject?.symbol ?: return + val companionOfEnumSymbol = enumClass.companionObjectSymbol ?: return val initializerObject = (declaration.initializer as? FirAnonymousObjectExpression)?.anonymousObject ?: return val delegatingConstructorCall = initializerObject.primaryConstructorIfAny(context.session)?.resolvedDelegatedConstructorCall ?: return val visitor = Visitor(context, reporter, companionOfEnumSymbol) diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 43bbeabafe6..c0036140f91 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -15,9 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl -import org.jetbrains.kotlin.fir.declarations.utils.addDeclarations -import org.jetbrains.kotlin.fir.declarations.utils.moduleName -import org.jetbrains.kotlin.fir.declarations.utils.sourceElement +import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag @@ -199,6 +197,7 @@ fun deserializeClassToSymbol( return 0 } }) + companionObjectSymbol = (declarations.firstOrNull { it is FirRegularClass && it.isCompanion } as FirRegularClass?)?.symbol }.also { if (isSealed) { val inheritors = classProto.sealedSubclassFqNameList.map { nameIndex -> diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index 7957913d371..2d70117875e 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -174,7 +174,7 @@ class FirElementSerializer private constructor( } } - val companionObject = regularClass?.companionObject + val companionObject = regularClass?.companionObjectSymbol?.fir if (companionObject != null) { builder.companionObjectName = getSimpleNameIndex(companionObject.name) } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt index 51f688ed9f4..1442c864d3c 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt @@ -61,9 +61,6 @@ class FirJavaClass @FirImplementationDetail internal constructor( override val attributes: FirDeclarationAttributes = FirDeclarationAttributes() - override val companionObject: FirRegularClass? - get() = null - override fun replaceSuperTypeRefs(newSuperTypeRefs: List) { superTypeRefs.clear() superTypeRefs.addAll(newSuperTypeRefs) @@ -79,6 +76,11 @@ class FirJavaClass @FirImplementationDetail internal constructor( override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {} + override val companionObjectSymbol: FirRegularClassSymbol? + get() = null + + override fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) {} + override fun acceptChildren(visitor: FirVisitor, data: D) { declarations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) } @@ -116,10 +118,6 @@ class FirJavaClass @FirImplementationDetail internal constructor( return this } - override fun transformCompanionObject(transformer: FirTransformer, data: D): FirJavaClass { - return this - } - override fun transformTypeParameters(transformer: FirTransformer, data: D): FirRegularClass { typeParameters.transformInplace(transformer, data) return this @@ -166,13 +164,6 @@ internal class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationCont ) } - @Deprecated("Modification of 'hasLazyNestedClassifiers' has no impact for FirRegularClassImplBuilder", level = DeprecationLevel.HIDDEN) - override var companionObject: FirRegularClass? - get() = throw IllegalStateException() - set(@Suppress("UNUSED_PARAMETER") value) { - throw IllegalStateException() - } - @Deprecated("Modification of 'origin' has no impact for FirJavaClassBuilder", level = DeprecationLevel.HIDDEN) override var origin: FirDeclarationOrigin get() = throw IllegalStateException() diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index af2ccd0fcea..079f54562a2 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -560,6 +560,7 @@ class DeclarationsConverter( modifiers.hasExpect() ) } + initCompanionObjectSymbolAttr() } } }.also { diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 1b5f333dbec..07c37a01510 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1133,6 +1133,8 @@ open class RawFirBuilder( ) } + initCompanionObjectSymbolAttr() + context.popFirTypeParameters() } } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index 64bb083c826..f13d124929c 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.utils.addDeclaration +import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeUnderscoreIsReserved @@ -1202,6 +1203,10 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } } + protected fun FirRegularClassBuilder.initCompanionObjectSymbolAttr() { + companionObjectSymbol = (declarations.firstOrNull { it is FirRegularClass && it.isCompanion } as FirRegularClass?)?.symbol + } + protected fun FirCallableDeclaration.initContainingClassAttr() { initContainingClassAttr(context) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 4fdad581e03..dcfbd74609b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -178,10 +178,10 @@ internal fun typeForQualifierByDeclaration(declaration: FirDeclaration, resultTy declaration.symbol.constructType(emptyArray(), false), ) } else { - val companionObject = declaration.companionObject - if (companionObject != null) { + val companionObjectSymbol = declaration.companionObjectSymbol + if (companionObjectSymbol != null) { return resultType.resolvedTypeFromPrototype( - companionObject.symbol.constructType(emptyArray(), false), + companionObjectSymbol.constructType(emptyArray(), false), ) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt index 964f83cf24e..7349c102696 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.builder.buildErrorFunction import org.jetbrains.kotlin.fir.declarations.builder.buildErrorProperty -import org.jetbrains.kotlin.fir.declarations.utils.classId import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.moduleData @@ -92,7 +91,7 @@ class CandidateFactory private constructor( val expressionReceiverValue = this as? ExpressionReceiverValue ?: return false val resolvedQualifier = (expressionReceiverValue.explicitReceiver as? FirResolvedQualifier) ?: return false val originClassOfCandidate = expressionReceiverValue.type.classId ?: return false - return (resolvedQualifier.symbol?.fir as? FirRegularClass)?.companionObject?.classId == originClassOfCandidate + return (resolvedQualifier.symbol?.fir as? FirRegularClass)?.companionObjectSymbol?.classId == originClassOfCandidate } fun createErrorCandidate(callInfo: CallInfo, diagnostic: ConeDiagnostic): Candidate { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 7572f2da5f3..e6d2c50d3f7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -250,7 +250,7 @@ open class FirTypeResolveTransformer( } session.nestedClassifierScope(firClass)?.let(scopes::add) if (firClass is FirRegularClass) { - val companionObject = firClass.companionObject + val companionObject = firClass.companionObjectSymbol?.fir if (companionObject != null) { session.nestedClassifierScope(companionObject)?.let(scopes::add) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt index 4d6df5d020e..464a3f46010 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt @@ -10,10 +10,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.diagnostics.WhenMissingCase import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry -import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.declarations.collectEnumEntries -import org.jetbrains.kotlin.fir.declarations.getSealedClassInheritors +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.LogicOperationKind.OR @@ -342,7 +339,7 @@ private object WhenOnSealedClassExhaustivenessChecker : WhenExhaustivenessChecke if (firClass?.classKind == ClassKind.OBJECT) { firClass.symbol } else { - firClass?.companionObject?.symbol + firClass?.companionObjectSymbol } } else -> { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt index 49a53545368..aa77c68ceba 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt @@ -223,7 +223,6 @@ open class FirContractResolveTransformer( } override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement { - regularClass.transformCompanionObject(this, data) context.withRegularClass(regularClass, components, forContracts = true) { transformDeclarationContent(regularClass, data) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAbstractAnnotationResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAbstractAnnotationResolveTransformer.kt index f0fafea37a9..3f51e6380e5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAbstractAnnotationResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAbstractAnnotationResolveTransformer.kt @@ -44,7 +44,6 @@ internal abstract class FirAbstractAnnotationResolveTransformer( return transformDeclaration(regularClass, data).also { val state = beforeTransformingChildren(regularClass) regularClass.transformDeclarations(this, data) - regularClass.transformCompanionObject(this, data) regularClass.transformSuperTypeRefs(this, data) afterTransformingChildren(state) } as FirStatement diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveTransformer.kt index d8d0f1d633c..fce6b491e59 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveTransformer.kt @@ -43,7 +43,6 @@ private class FirDeclarationsResolveTransformerForArgumentAnnotations( .transformTypeParameters(transformer, data) .transformSuperTypeRefs(transformer, data) .transformDeclarations(transformer, data) - .transformCompanionObject(transformer, data) } } return regularClass diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt index 270c2cbab11..b3fb2485b9c 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt @@ -54,7 +54,7 @@ data class ImplicitReceivers( fun SessionHolder.collectTowerDataElementsForClass(owner: FirClass, defaultType: ConeKotlinType): TowerElementsForClass { val allImplicitCompanionValues = mutableListOf>() - val companionObject = (owner as? FirRegularClass)?.companionObject + val companionObject = (owner as? FirRegularClass)?.companionObjectSymbol?.fir val companionReceiver = companionObject?.let { companion -> ImplicitDispatchReceiverValue( companion.symbol, session, scopeSession @@ -72,9 +72,9 @@ fun SessionHolder.collectTowerDataElementsForClass(owner: FirClass, defaultType: ?.asTowerDataElement(isLocal = false) ?.let(superClassesStaticsAndCompanionReceivers::add) - (superClass as? FirRegularClass)?.companionObject?.let { companion -> + (superClass as? FirRegularClass)?.companionObjectSymbol?.let { val superCompanionReceiver = ImplicitDispatchReceiverValue( - companion.symbol, session, scopeSession + it, session, scopeSession ) superClassesStaticsAndCompanionReceivers += superCompanionReceiver.asTowerDataElement() diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirRegularClass.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirRegularClass.kt index f0544c696cb..d91f50502a4 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirRegularClass.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirRegularClass.kt @@ -38,8 +38,8 @@ abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner { abstract override val controlFlowGraphReference: FirControlFlowGraphReference? abstract val name: Name abstract override val symbol: FirRegularClassSymbol - abstract val companionObject: FirRegularClass? abstract val hasLazyNestedClassifiers: Boolean + abstract val companionObjectSymbol: FirRegularClassSymbol? abstract override val superTypeRefs: List override fun accept(visitor: FirVisitor, data: D): R = visitor.visitRegularClass(this, data) @@ -54,6 +54,8 @@ abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner { abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) + abstract fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) + abstract override fun replaceSuperTypeRefs(newSuperTypeRefs: List) abstract override fun transformTypeParameters(transformer: FirTransformer, data: D): FirRegularClass @@ -64,7 +66,5 @@ abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner { abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirRegularClass - abstract fun transformCompanionObject(transformer: FirTransformer, data: D): FirRegularClass - abstract override fun transformSuperTypeRefs(transformer: FirTransformer, data: D): FirRegularClass } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirRegularClassBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirRegularClassBuilder.kt index 88fc581c1e0..16cd412d75e 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirRegularClassBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirRegularClassBuilder.kt @@ -51,7 +51,7 @@ open class FirRegularClassBuilder : FirClassBuilder, FirTypeParameterRefsOwnerBu override lateinit var scopeProvider: FirScopeProvider open lateinit var name: Name open lateinit var symbol: FirRegularClassSymbol - open var companionObject: FirRegularClass? = null + open var companionObjectSymbol: FirRegularClassSymbol? = null override val superTypeRefs: MutableList = mutableListOf() override fun build(): FirRegularClass { @@ -70,7 +70,7 @@ open class FirRegularClassBuilder : FirClassBuilder, FirTypeParameterRefsOwnerBu scopeProvider, name, symbol, - companionObject, + companionObjectSymbol, superTypeRefs, ) } @@ -105,7 +105,7 @@ inline fun buildRegularClassCopy(original: FirRegularClass, init: FirRegularClas copyBuilder.scopeProvider = original.scopeProvider copyBuilder.name = original.name copyBuilder.symbol = original.symbol - copyBuilder.companionObject = original.companionObject + copyBuilder.companionObjectSymbol = original.companionObjectSymbol copyBuilder.superTypeRefs.addAll(original.superTypeRefs) return copyBuilder.apply(init).build() } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirRegularClassImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirRegularClassImpl.kt index 9cfb8e50bb2..1462eb2ee99 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirRegularClassImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirRegularClassImpl.kt @@ -45,7 +45,7 @@ internal class FirRegularClassImpl( override val scopeProvider: FirScopeProvider, override val name: Name, override val symbol: FirRegularClassSymbol, - override var companionObject: FirRegularClass?, + override var companionObjectSymbol: FirRegularClassSymbol?, override val superTypeRefs: MutableList, ) : FirRegularClass() { override var controlFlowGraphReference: FirControlFlowGraphReference? = null @@ -70,7 +70,6 @@ internal class FirRegularClassImpl( transformDeclarations(transformer, data) transformAnnotations(transformer, data) controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data) - companionObject = declarations.asSequence().filterIsInstance().firstOrNull { it.status.isCompanion } transformSuperTypeRefs(transformer, data) return this } @@ -95,11 +94,6 @@ internal class FirRegularClassImpl( return this } - override fun transformCompanionObject(transformer: FirTransformer, data: D): FirRegularClassImpl { - companionObject = companionObject?.transform(transformer, data) - return this - } - override fun transformSuperTypeRefs(transformer: FirTransformer, data: D): FirRegularClassImpl { superTypeRefs.transformInplace(transformer, data) return this @@ -117,6 +111,10 @@ internal class FirRegularClassImpl( controlFlowGraphReference = newControlFlowGraphReference } + override fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) { + companionObjectSymbol = newCompanionObjectSymbol + } + override fun replaceSuperTypeRefs(newSuperTypeRefs: List) { superTypeRefs.clear() superTypeRefs.addAll(newSuperTypeRefs) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt index a16dcc01bbf..61375aea19c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt @@ -36,7 +36,7 @@ internal class FirResolvedQualifierImpl( override val classId: ClassId? get() = relativeClassFqName?.let { ClassId(packageFqName, it, false) } - override var resolvedToCompanionObject: Boolean = (symbol?.fir as? FirRegularClass)?.companionObject != null + override var resolvedToCompanionObject: Boolean = (symbol?.fir as? FirRegularClass)?.companionObjectSymbol != null override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirDeclarationBuildingUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirDeclarationBuildingUtils.kt index 32b469d2efe..2d6616b0bf8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirDeclarationBuildingUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirDeclarationBuildingUtils.kt @@ -21,9 +21,6 @@ fun FirTypeParameterBuilder.addDefaultBoundIfNecessary() { fun FirRegularClassBuilder.addDeclaration(declaration: FirDeclaration) { declarations += declaration - if (companionObject == null && declaration is FirRegularClass && declaration.isCompanion) { - companionObject = declaration - } } fun FirRegularClassBuilder.addDeclarations(declarations: Collection) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt index e2fb4d4ecf6..854bb436a53 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt @@ -66,7 +66,7 @@ class FirRegularClassSymbol(classId: ClassId) : FirClassSymbol( } val companionObjectSymbol: FirRegularClassSymbol? - get() = fir.companionObject?.symbol + get() = fir.companionObjectSymbol } val ANONYMOUS_CLASS_ID = ClassId(FqName.ROOT, FqName.topLevel(SpecialNames.ANONYMOUS), true) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index 0ca51518baa..ef4bbcd0f85 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -40,7 +40,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree builder(regularClass) { parents += classBuilder parents += typeParameterRefsOwnerBuilder - defaultNull("companionObject") + defaultNull("companionObjectSymbol") openBuilder() withCopy() } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 51fbf9b8063..f399149fc42 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.tree.generator import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeImplementationConfigurator import org.jetbrains.kotlin.fir.tree.generator.model.Implementation.Kind.Object import org.jetbrains.kotlin.fir.tree.generator.model.Implementation.Kind.OpenClass +import org.jetbrains.kotlin.fir.tree.generator.model.Type object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() { fun configureImplementations() { @@ -496,7 +497,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() // // If this `FirResolvedQualifier` is a receiver expression of some other qualified access, the value is updated in // `FirCallResolver` according to the resolution result. - default("resolvedToCompanionObject", "(symbol?.fir as? FirRegularClass)?.companionObject != null") + default("resolvedToCompanionObject", "(symbol?.fir as? FirRegularClass)?.companionObjectSymbol != null") useTypes(regularClass) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 141554d63f7..7b0c52fd02b 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -251,8 +251,8 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild regularClass.configure { +name +symbol("FirRegularClassSymbol") - +field("companionObject", regularClass, nullable = true).withTransform() +booleanField("hasLazyNestedClassifiers") + +field("companionObjectSymbol", regularClassSymbolType, nullable = true, withReplace = true) +superTypeRefs(withReplace = true) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt index 5bbc71fda13..fe5a6827f07 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt @@ -70,6 +70,7 @@ val backingFieldSymbolType = type("fir.symbols.impl", "FirBackingFieldSymbol") val delegateFieldSymbolType = type("fir.symbols.impl", "FirDelegateFieldSymbol") val classSymbolType = type("fir.symbols.impl", "FirClassSymbol") val classLikeSymbolType = type("fir.symbols.impl", "FirClassLikeSymbol<*>") +val regularClassSymbolType = type("fir.symbols.impl", "FirRegularClassSymbol") val typeParameterSymbolType = type("fir.symbols.impl", "FirTypeParameterSymbol") val emptyArgumentListType = type("fir.expressions", "FirEmptyArgumentList") val firScopeProviderType = type("fir.scopes", "FirScopeProvider") diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt index 3041f9555ce..3def274dae9 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt @@ -105,7 +105,7 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { element.allFields.filter { - it.withBindThis && it.type.contains("Symbol") && it !is FieldList + it.withBindThis && it.type.contains("Symbol") && it !is FieldList && it.name != "companionObjectSymbol" }.takeIf { it.isNotEmpty() && !isInterface && !isAbstract && !element.type.contains("Reference") @@ -225,10 +225,6 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { field.name in setOf("dispatchReceiver", "extensionReceiver") -> {} - field.name == "companionObject" -> { - println("companionObject = declarations.asSequence().filterIsInstance().firstOrNull { it.status.isCompanion }") - } - field.needsSeparateTransform -> { if (!(element.needTransformOtherChildren && field.needTransformInOtherChildren)) { println("transform${field.name.replaceFirstChar(Char::uppercaseChar)}(transformer, data)") diff --git a/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/FirVisualizer.kt b/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/FirVisualizer.kt index 57e45116686..f651aeda3cd 100644 --- a/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/FirVisualizer.kt +++ b/compiler/visualizer/render-fir/src/org/jetbrains/kotlin/compiler/visualizer/FirVisualizer.kt @@ -780,7 +780,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() { override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: StringBuilder) { val fir = resolvedQualifier.symbol?.fir when { - fir is FirRegularClass && fir.classKind != ClassKind.ENUM_CLASS && fir.companionObject?.defaultType() == resolvedQualifier.typeRef.coneTypeSafe() -> { + fir is FirRegularClass && fir.classKind != ClassKind.ENUM_CLASS && fir.companionObjectSymbol?.defaultType() == resolvedQualifier.typeRef.coneTypeSafe() -> { data.append("companion object ") data.append(resolvedQualifier.typeRef.render()).append(": ") data.append(fir.symbol.classId.asString().removeCurrentFilePackage())