From 75b6f7ca000b447297ef59758b4a7d64d91b5e98 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 18 Oct 2021 18:37:14 +0300 Subject: [PATCH] [FIR] Make FirRegularClass.companionObject companionObjectSymbol field This is needed for two reasons: 1. Before this change companion object appeared in FirRegularClass twice: in declarations list and in companionObject field. This may trigger twice transform of it 2. It's very hard to implement generation of companion object by plugins because if it is part of the tree then generated declaration must be registered in FirProvider, which is inconsistent with other generated declarations. Replacing FIR with symbol and removing custom logic of visiting/transforming companion FIR allows us to just replace companionSymbol in FirClass if plugin wants to generate it without any additional work --- .../references/FirReferenceResolveHelper.kt | 4 ++-- .../symbols/KtFirNamedClassOrObjectSymbol.kt | 2 +- ...umCompanionInEnumConstructorCallChecker.kt | 3 +-- .../deserialization/ClassDeserialization.kt | 5 ++--- .../fir/serialization/FirElementSerializer.kt | 2 +- .../fir/java/declarations/FirJavaClass.kt | 19 +++++-------------- .../converter/DeclarationsConverter.kt | 1 + .../kotlin/fir/builder/RawFirBuilder.kt | 2 ++ .../kotlin/fir/builder/BaseFirBuilder.kt | 5 +++++ .../kotlin/fir/resolve/ResolveUtils.kt | 6 +++--- .../fir/resolve/calls/CandidateFactory.kt | 3 +-- .../transformers/FirTypeResolveTransformer.kt | 2 +- .../FirWhenExhaustivenessTransformer.kt | 7 ++----- .../FirContractResolveTransformer.kt | 1 - ...FirAbstractAnnotationResolveTransformer.kt | 1 - ...irAnnotationArgumentsResolveTransformer.kt | 1 - .../fir/declarations/ImplicitReceiverUtils.kt | 6 +++--- .../fir/declarations/FirRegularClass.kt | 6 +++--- .../builder/FirRegularClassBuilder.kt | 6 +++--- .../declarations/impl/FirRegularClassImpl.kt | 12 +++++------- .../impl/FirResolvedQualifierImpl.kt | 2 +- .../utils/FirDeclarationBuildingUtils.kt | 3 --- .../fir/symbols/impl/FirClassLikeSymbol.kt | 2 +- .../fir/tree/generator/BuilderConfigurator.kt | 2 +- .../generator/ImplementationConfigurator.kt | 3 ++- .../fir/tree/generator/NodeConfigurator.kt | 2 +- .../kotlin/fir/tree/generator/Types.kt | 1 + .../tree/generator/printer/implementation.kt | 6 +----- .../compiler/visualizer/FirVisualizer.kt | 2 +- 29 files changed, 50 insertions(+), 67 deletions(-) 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())