[FIR] Make FirClass an inheritor of FirControlFlowGraphOwner

Both inheritors of FirClass (FirRegularClass and FirAnonymousObject)
  already were CFG owners
This commit is contained in:
Dmitriy Novozhilov
2023-03-27 19:43:53 +03:00
committed by Space Team
parent a9c1091140
commit cbfa155333
10 changed files with 38 additions and 26 deletions
@@ -377,7 +377,7 @@ class ControlFlowGraphBuilder {
}
fun enterClass(klass: FirClass, buildGraph: Boolean): Pair<CFGNode<*>?, ClassEnterNode?> {
if (!buildGraph || klass !is FirControlFlowGraphOwner) {
if (!buildGraph) {
graphs.push(ControlFlowGraph(null, "<discarded class graph>", ControlFlowGraph.Kind.Class))
return null to null
}
@@ -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<FirTypeParameterRef>
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<FirTypeRef>
abstract override val declarations: List<FirDeclaration>
abstract override val annotations: List<FirAnnotation>
abstract override val scopeProvider: FirScopeProvider
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirAnonymousObjectSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, 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<FirTypeRef>)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
abstract override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirAnonymousObject
abstract override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirAnonymousObject
@@ -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<FirTypeParameterRef>
abstract override val status: FirDeclarationStatus
abstract override val deprecationsProvider: DeprecationsProvider
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirClassSymbol<out FirClass>
abstract val classKind: ClassKind
abstract val superTypeRefs: List<FirTypeRef>
@@ -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<FirTypeRef>)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
@@ -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<FirTypeParameterRef>
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<FirDeclaration>
abstract override val annotations: List<FirAnnotation>
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<FirAnnotation>)
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?)
abstract override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>)
@@ -58,19 +58,19 @@ internal class FirAnonymousObjectImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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<FirTypeRef>) {
superTypeRefs.clear()
superTypeRefs.addAll(newSuperTypeRefs)
@@ -119,8 +123,4 @@ internal class FirAnonymousObjectImpl(
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
controlFlowGraphReference = newControlFlowGraphReference
}
}
@@ -64,9 +64,9 @@ internal class FirRegularClassImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
controlFlowGraphReference = newControlFlowGraphReference
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
override fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) {
companionObjectSymbol = newCompanionObjectSymbol
}
@@ -178,12 +178,16 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
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)
@@ -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)
@@ -34,7 +34,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(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) {
@@ -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)