[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?> { 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)) graphs.push(ControlFlowGraph(null, "<discarded class graph>", ControlFlowGraph.Kind.Class))
return null to null return null to null
} }
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
abstract class FirAnonymousObject : FirClass(), FirControlFlowGraphOwner { abstract class FirAnonymousObject : FirClass() {
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract override val resolvePhase: FirResolvePhase abstract override val resolvePhase: FirResolvePhase
abstract override val moduleData: FirModuleData abstract override val moduleData: FirModuleData
@@ -30,12 +30,12 @@ abstract class FirAnonymousObject : FirClass(), FirControlFlowGraphOwner {
abstract override val typeParameters: List<FirTypeParameterRef> abstract override val typeParameters: List<FirTypeParameterRef>
abstract override val status: FirDeclarationStatus abstract override val status: FirDeclarationStatus
abstract override val deprecationsProvider: DeprecationsProvider abstract override val deprecationsProvider: DeprecationsProvider
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val classKind: ClassKind abstract override val classKind: ClassKind
abstract override val superTypeRefs: List<FirTypeRef> abstract override val superTypeRefs: List<FirTypeRef>
abstract override val declarations: List<FirDeclaration> abstract override val declarations: List<FirDeclaration>
abstract override val annotations: List<FirAnnotation> abstract override val annotations: List<FirAnnotation>
abstract override val scopeProvider: FirScopeProvider abstract override val scopeProvider: FirScopeProvider
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirAnonymousObjectSymbol abstract override val symbol: FirAnonymousObjectSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitAnonymousObject(this, data) 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 replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider)
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
abstract override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) abstract override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) 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> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirAnonymousObject
abstract override fun <D> transformStatus(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.FirModuleData
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirStatement 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.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -21,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * 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 source: KtSourceElement?
abstract override val resolvePhase: FirResolvePhase abstract override val resolvePhase: FirResolvePhase
abstract override val moduleData: FirModuleData abstract override val moduleData: FirModuleData
@@ -30,6 +31,7 @@ sealed class FirClass : FirClassLikeDeclaration(), FirStatement, FirTypeParamete
abstract override val typeParameters: List<FirTypeParameterRef> abstract override val typeParameters: List<FirTypeParameterRef>
abstract override val status: FirDeclarationStatus abstract override val status: FirDeclarationStatus
abstract override val deprecationsProvider: DeprecationsProvider abstract override val deprecationsProvider: DeprecationsProvider
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirClassSymbol<out FirClass> abstract override val symbol: FirClassSymbol<out FirClass>
abstract val classKind: ClassKind abstract val classKind: ClassKind
abstract val superTypeRefs: List<FirTypeRef> abstract val superTypeRefs: List<FirTypeRef>
@@ -49,6 +51,8 @@ sealed class FirClass : FirClassLikeDeclaration(), FirStatement, FirTypeParamete
abstract override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) abstract override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider)
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
abstract fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) abstract fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner { abstract class FirRegularClass : FirClass() {
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract override val resolvePhase: FirResolvePhase abstract override val resolvePhase: FirResolvePhase
abstract override val moduleData: FirModuleData abstract override val moduleData: FirModuleData
@@ -31,11 +31,11 @@ abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner {
abstract override val typeParameters: List<FirTypeParameterRef> abstract override val typeParameters: List<FirTypeParameterRef>
abstract override val status: FirDeclarationStatus abstract override val status: FirDeclarationStatus
abstract override val deprecationsProvider: DeprecationsProvider abstract override val deprecationsProvider: DeprecationsProvider
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val classKind: ClassKind abstract override val classKind: ClassKind
abstract override val declarations: List<FirDeclaration> abstract override val declarations: List<FirDeclaration>
abstract override val annotations: List<FirAnnotation> abstract override val annotations: List<FirAnnotation>
abstract override val scopeProvider: FirScopeProvider abstract override val scopeProvider: FirScopeProvider
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract val name: Name abstract val name: Name
abstract override val symbol: FirRegularClassSymbol abstract override val symbol: FirRegularClassSymbol
abstract val hasLazyNestedClassifiers: Boolean abstract val hasLazyNestedClassifiers: Boolean
@@ -55,10 +55,10 @@ abstract class FirRegularClass : FirClass(), FirControlFlowGraphOwner {
abstract override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) abstract override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) abstract fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?)
abstract override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) 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) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeParameters.forEach { it.accept(visitor, data) } typeParameters.forEach { it.accept(visitor, data) }
status.accept(visitor, data) status.accept(visitor, data)
controlFlowGraphReference?.accept(visitor, data)
superTypeRefs.forEach { it.accept(visitor, data) } superTypeRefs.forEach { it.accept(visitor, data) }
declarations.forEach { it.accept(visitor, data) } declarations.forEach { it.accept(visitor, data) }
annotations.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 { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAnonymousObjectImpl {
transformTypeParameters(transformer, data) transformTypeParameters(transformer, data)
transformStatus(transformer, data) transformStatus(transformer, data)
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
transformSuperTypeRefs(transformer, data) transformSuperTypeRefs(transformer, data)
transformDeclarations(transformer, data) transformDeclarations(transformer, data)
transformAnnotations(transformer, data) transformAnnotations(transformer, data)
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
return this return this
} }
@@ -111,6 +111,10 @@ internal class FirAnonymousObjectImpl(
deprecationsProvider = newDeprecationsProvider deprecationsProvider = newDeprecationsProvider
} }
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
controlFlowGraphReference = newControlFlowGraphReference
}
override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) { override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) {
superTypeRefs.clear() superTypeRefs.clear()
superTypeRefs.addAll(newSuperTypeRefs) superTypeRefs.addAll(newSuperTypeRefs)
@@ -119,8 +123,4 @@ internal class FirAnonymousObjectImpl(
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) { override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty() 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) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeParameters.forEach { it.accept(visitor, data) } typeParameters.forEach { it.accept(visitor, data) }
status.accept(visitor, data) status.accept(visitor, data)
controlFlowGraphReference?.accept(visitor, data)
declarations.forEach { it.accept(visitor, data) } declarations.forEach { it.accept(visitor, data) }
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
controlFlowGraphReference?.accept(visitor, data)
superTypeRefs.forEach { it.accept(visitor, data) } superTypeRefs.forEach { it.accept(visitor, data) }
contextReceivers.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 { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirRegularClassImpl {
transformTypeParameters(transformer, data) transformTypeParameters(transformer, data)
transformStatus(transformer, data) transformStatus(transformer, data)
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
transformDeclarations(transformer, data) transformDeclarations(transformer, data)
transformAnnotations(transformer, data) transformAnnotations(transformer, data)
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
transformSuperTypeRefs(transformer, data) transformSuperTypeRefs(transformer, data)
contextReceivers.transformInplace(transformer, data) contextReceivers.transformInplace(transformer, data)
return this return this
@@ -119,14 +119,14 @@ internal class FirRegularClassImpl(
deprecationsProvider = newDeprecationsProvider deprecationsProvider = newDeprecationsProvider
} }
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
controlFlowGraphReference = newControlFlowGraphReference controlFlowGraphReference = newControlFlowGraphReference
} }
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
override fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) { override fun replaceCompanionObjectSymbol(newCompanionObjectSymbol: FirRegularClassSymbol?) {
companionObjectSymbol = newCompanionObjectSymbol 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 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 visitFile(file: FirFile, data: D): R = visitDeclaration(file, data)
override fun visitScript(script: FirScript, data: D): R = visitDeclaration(script, 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 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 visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression, data: D): R = visitExpression(anonymousObjectExpression, data)
override fun visitResolvedImport(resolvedImport: FirResolvedImport, data: D): R = visitImport(resolvedImport, 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 visitEnumEntry(enumEntry: FirEnumEntry) = visitVariable(enumEntry)
override fun visitRegularClass(regularClass: FirRegularClass) = visitClass(regularClass)
override fun visitFile(file: FirFile) = visitDeclaration(file) override fun visitFile(file: FirFile) = visitDeclaration(file)
override fun visitScript(script: FirScript) = visitDeclaration(script) override fun visitScript(script: FirScript) = visitDeclaration(script)
override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) = visitExpression(anonymousFunctionExpression) override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) = visitExpression(anonymousFunctionExpression)
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) = visitClass(anonymousObject)
override fun visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression) = visitExpression(anonymousObjectExpression) override fun visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression) = visitExpression(anonymousObjectExpression)
override fun visitResolvedImport(resolvedImport: FirResolvedImport) = visitImport(resolvedImport) override fun visitResolvedImport(resolvedImport: FirResolvedImport) = visitImport(resolvedImport)
@@ -34,7 +34,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
val classBuilder by builder { val classBuilder by builder {
parents += declarationBuilder parents += declarationBuilder
parents += annotationContainerBuilder parents += annotationContainerBuilder
fields from klass without listOf("symbol", "resolvePhase") fields from klass without listOf("symbol", "resolvePhase", "controlFlowGraphReference")
} }
builder(regularClass) { builder(regularClass) {
@@ -51,8 +51,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val functionTypeParameter by element(Other, baseFirElement) val functionTypeParameter by element(Other, baseFirElement)
val classLikeDeclaration by sealedElement(Declaration, memberDeclaration, statement) val classLikeDeclaration by sealedElement(Declaration, memberDeclaration, statement)
val klass by sealedElement("Class", Declaration, classLikeDeclaration, statement, typeParameterRefsOwner) val klass by sealedElement("Class", Declaration, classLikeDeclaration, statement, typeParameterRefsOwner, controlFlowGraphOwner)
val regularClass by element(Declaration, klass, controlFlowGraphOwner) val regularClass by element(Declaration, klass)
val typeAlias by element(Declaration, classLikeDeclaration, typeParametersOwner) val typeAlias by element(Declaration, classLikeDeclaration, typeParametersOwner)
val function by sealedElement(Declaration, callableDeclaration, targetElement, controlFlowGraphOwner, statement) 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 anonymousFunction by element(Declaration, function, typeParametersOwner, contractDescriptionOwner)
val anonymousFunctionExpression by element(Expression, expression) 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 anonymousObjectExpression by element(Expression, expression)
val diagnosticHolder by element(Diagnostics) val diagnosticHolder by element(Diagnostics)