From cbfa1553332bb9424b7f0ef38a330c8a6d24a12d Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 27 Mar 2023 19:43:53 +0300 Subject: [PATCH] [FIR] Make FirClass an inheritor of FirControlFlowGraphOwner Both inheritors of FirClass (FirRegularClass and FirAnonymousObject) already were CFG owners --- .../fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt | 2 +- .../kotlin/fir/declarations/FirAnonymousObject.kt | 8 ++++---- .../jetbrains/kotlin/fir/declarations/FirClass.kt | 6 +++++- .../kotlin/fir/declarations/FirRegularClass.kt | 8 ++++---- .../fir/declarations/impl/FirAnonymousObjectImpl.kt | 12 ++++++------ .../fir/declarations/impl/FirRegularClassImpl.kt | 12 ++++++------ .../kotlin/fir/visitors/FirDefaultVisitor.kt | 4 ++++ .../kotlin/fir/visitors/FirDefaultVisitorVoid.kt | 4 ++++ .../kotlin/fir/tree/generator/BuilderConfigurator.kt | 2 +- .../kotlin/fir/tree/generator/FirTreeBuilder.kt | 6 +++--- 10 files changed, 38 insertions(+), 26 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index 66b45ab8ba7..0d74ee07de4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -377,7 +377,7 @@ class ControlFlowGraphBuilder { } fun enterClass(klass: FirClass, buildGraph: Boolean): Pair?, ClassEnterNode?> { - if (!buildGraph || klass !is FirControlFlowGraphOwner) { + if (!buildGraph) { graphs.push(ControlFlowGraph(null, "", ControlFlowGraph.Kind.Class)) return null to null } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousObject.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousObject.kt index a6c0db4ff0f..efb6f9859c8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousObject.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousObject.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -abstract class FirAnonymousObject : FirClass(), FirControlFlowGraphOwner { +abstract class FirAnonymousObject : FirClass() { abstract override val source: KtSourceElement? abstract override val resolvePhase: FirResolvePhase abstract override val moduleData: FirModuleData @@ -30,12 +30,12 @@ abstract class FirAnonymousObject : FirClass(), FirControlFlowGraphOwner { abstract override val typeParameters: List abstract override val status: FirDeclarationStatus abstract override val deprecationsProvider: DeprecationsProvider + abstract override val controlFlowGraphReference: FirControlFlowGraphReference? abstract override val classKind: ClassKind abstract override val superTypeRefs: List abstract override val declarations: List abstract override val annotations: List abstract override val scopeProvider: FirScopeProvider - abstract override val controlFlowGraphReference: FirControlFlowGraphReference? abstract override val symbol: FirAnonymousObjectSymbol override fun accept(visitor: FirVisitor, data: D): R = visitor.visitAnonymousObject(this, data) @@ -50,12 +50,12 @@ abstract class FirAnonymousObject : FirClass(), FirControlFlowGraphOwner { abstract override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) + abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) + abstract override fun replaceSuperTypeRefs(newSuperTypeRefs: List) abstract override fun replaceAnnotations(newAnnotations: List) - abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) - abstract override fun transformTypeParameters(transformer: FirTransformer, data: D): FirAnonymousObject abstract override fun transformStatus(transformer: FirTransformer, data: D): FirAnonymousObject diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirClass.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirClass.kt index 00ac1f3eca3..ac967a09930 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirClass.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirClass.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.types.FirTypeRef @@ -21,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -sealed class FirClass : FirClassLikeDeclaration(), FirStatement, FirTypeParameterRefsOwner { +sealed class FirClass : FirClassLikeDeclaration(), FirStatement, FirTypeParameterRefsOwner, FirControlFlowGraphOwner { abstract override val source: KtSourceElement? abstract override val resolvePhase: FirResolvePhase abstract override val moduleData: FirModuleData @@ -30,6 +31,7 @@ sealed class FirClass : FirClassLikeDeclaration(), FirStatement, FirTypeParamete abstract override val typeParameters: List abstract override val status: FirDeclarationStatus abstract override val deprecationsProvider: DeprecationsProvider + abstract override val controlFlowGraphReference: FirControlFlowGraphReference? abstract override val symbol: FirClassSymbol abstract val classKind: ClassKind abstract val superTypeRefs: List @@ -49,6 +51,8 @@ sealed class FirClass : FirClassLikeDeclaration(), FirStatement, FirTypeParamete abstract override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) + abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) + abstract fun replaceSuperTypeRefs(newSuperTypeRefs: List) abstract override fun replaceAnnotations(newAnnotations: List) 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 70e236b4fe1..1b207af5731 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 @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner { +abstract class FirRegularClass : FirClass() { abstract override val source: KtSourceElement? abstract override val resolvePhase: FirResolvePhase abstract override val moduleData: FirModuleData @@ -31,11 +31,11 @@ abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner { abstract override val typeParameters: List abstract override val status: FirDeclarationStatus abstract override val deprecationsProvider: DeprecationsProvider + abstract override val controlFlowGraphReference: FirControlFlowGraphReference? abstract override val classKind: ClassKind abstract override val declarations: List abstract override val annotations: List abstract override val scopeProvider: FirScopeProvider - abstract override val controlFlowGraphReference: FirControlFlowGraphReference? abstract val name: Name abstract override val symbol: FirRegularClassSymbol abstract val hasLazyNestedClassifiers: Boolean @@ -55,10 +55,10 @@ abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner { abstract override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) - abstract override fun replaceAnnotations(newAnnotations: List) - abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) + abstract override fun replaceAnnotations(newAnnotations: List) + abstract fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) abstract override fun replaceSuperTypeRefs(newSuperTypeRefs: List) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt index a4b25696833..76ad00a482e 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt @@ -58,19 +58,19 @@ internal class FirAnonymousObjectImpl( override fun acceptChildren(visitor: FirVisitor, data: D) { typeParameters.forEach { it.accept(visitor, data) } status.accept(visitor, data) + controlFlowGraphReference?.accept(visitor, data) superTypeRefs.forEach { it.accept(visitor, data) } declarations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) } - controlFlowGraphReference?.accept(visitor, data) } override fun transformChildren(transformer: FirTransformer, data: D): FirAnonymousObjectImpl { transformTypeParameters(transformer, data) transformStatus(transformer, data) + controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data) transformSuperTypeRefs(transformer, data) transformDeclarations(transformer, data) transformAnnotations(transformer, data) - controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data) return this } @@ -111,6 +111,10 @@ internal class FirAnonymousObjectImpl( deprecationsProvider = newDeprecationsProvider } + override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { + controlFlowGraphReference = newControlFlowGraphReference + } + override fun replaceSuperTypeRefs(newSuperTypeRefs: List) { superTypeRefs.clear() superTypeRefs.addAll(newSuperTypeRefs) @@ -119,8 +123,4 @@ internal class FirAnonymousObjectImpl( override fun replaceAnnotations(newAnnotations: List) { annotations = newAnnotations.toMutableOrEmpty() } - - override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { - controlFlowGraphReference = newControlFlowGraphReference - } } 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 22e29613531..836e60f6265 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 @@ -64,9 +64,9 @@ internal class FirRegularClassImpl( override fun acceptChildren(visitor: FirVisitor, data: D) { typeParameters.forEach { it.accept(visitor, data) } status.accept(visitor, data) + controlFlowGraphReference?.accept(visitor, data) declarations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) } - controlFlowGraphReference?.accept(visitor, data) superTypeRefs.forEach { it.accept(visitor, data) } contextReceivers.forEach { it.accept(visitor, data) } } @@ -74,9 +74,9 @@ internal class FirRegularClassImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirRegularClassImpl { transformTypeParameters(transformer, data) transformStatus(transformer, data) + controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data) transformDeclarations(transformer, data) transformAnnotations(transformer, data) - controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data) transformSuperTypeRefs(transformer, data) contextReceivers.transformInplace(transformer, data) return this @@ -119,14 +119,14 @@ internal class FirRegularClassImpl( deprecationsProvider = newDeprecationsProvider } - override fun replaceAnnotations(newAnnotations: List) { - annotations = newAnnotations.toMutableOrEmpty() - } - override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { controlFlowGraphReference = newControlFlowGraphReference } + override fun replaceAnnotations(newAnnotations: List) { + annotations = newAnnotations.toMutableOrEmpty() + } + override fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) { companionObjectSymbol = newCompanionObjectSymbol } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt index 5b819f5c9e2..d0088d9bd7a 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt @@ -178,12 +178,16 @@ abstract class FirDefaultVisitor : FirVisitor() { override fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): R = visitVariable(enumEntry, data) + override fun visitRegularClass(regularClass: FirRegularClass, data: D): R = visitClass(regularClass, data) + override fun visitFile(file: FirFile, data: D): R = visitDeclaration(file, data) override fun visitScript(script: FirScript, data: D): R = visitDeclaration(script, data) override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression, data: D): R = visitExpression(anonymousFunctionExpression, data) + override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: D): R = visitClass(anonymousObject, data) + override fun visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression, data: D): R = visitExpression(anonymousObjectExpression, data) override fun visitResolvedImport(resolvedImport: FirResolvedImport, data: D): R = visitImport(resolvedImport, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt index 55384e8611e..1f5835b9f0c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt @@ -178,12 +178,16 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() { override fun visitEnumEntry(enumEntry: FirEnumEntry) = visitVariable(enumEntry) + override fun visitRegularClass(regularClass: FirRegularClass) = visitClass(regularClass) + override fun visitFile(file: FirFile) = visitDeclaration(file) override fun visitScript(script: FirScript) = visitDeclaration(script) override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) = visitExpression(anonymousFunctionExpression) + override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) = visitClass(anonymousObject) + override fun visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression) = visitExpression(anonymousObjectExpression) override fun visitResolvedImport(resolvedImport: FirResolvedImport) = visitImport(resolvedImport) 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 5177e648830..3e4f5d09da0 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 @@ -34,7 +34,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree val classBuilder by builder { parents += declarationBuilder parents += annotationContainerBuilder - fields from klass without listOf("symbol", "resolvePhase") + fields from klass without listOf("symbol", "resolvePhase", "controlFlowGraphReference") } builder(regularClass) { diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index a353346ade5..22c7021aa36 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -51,8 +51,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val functionTypeParameter by element(Other, baseFirElement) val classLikeDeclaration by sealedElement(Declaration, memberDeclaration, statement) - val klass by sealedElement("Class", Declaration, classLikeDeclaration, statement, typeParameterRefsOwner) - val regularClass by element(Declaration, klass, controlFlowGraphOwner) + val klass by sealedElement("Class", Declaration, classLikeDeclaration, statement, typeParameterRefsOwner, controlFlowGraphOwner) + val regularClass by element(Declaration, klass) val typeAlias by element(Declaration, classLikeDeclaration, typeParametersOwner) val function by sealedElement(Declaration, callableDeclaration, targetElement, controlFlowGraphOwner, statement) @@ -69,7 +69,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val anonymousFunction by element(Declaration, function, typeParametersOwner, contractDescriptionOwner) val anonymousFunctionExpression by element(Expression, expression) - val anonymousObject by element(Declaration, klass, controlFlowGraphOwner) + val anonymousObject by element(Declaration, klass) val anonymousObjectExpression by element(Expression, expression) val diagnosticHolder by element(Diagnostics)