[FIR] Add cfg nodes for classes

This commit is contained in:
Dmitriy Novozhilov
2020-03-26 11:35:28 +03:00
parent 74d86d82c6
commit ad9e6517c7
3 changed files with 45 additions and 2 deletions
@@ -133,7 +133,25 @@ class UnionFunctionCallArgumentsNode(owner: ControlFlowGraph, override val fir:
}
}
// ----------------------------------- Anonymous object -----------------------------------
// ----------------------------------- Classes -----------------------------------
class ClassEnterNode(owner: ControlFlowGraph, override val fir: FirClass<*>, level: Int, id: Int) : CFGNode<FirClass<*>>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitClassEnterNode(this, data)
}
}
class ClassExitNode(owner: ControlFlowGraph, override val fir: FirClass<*>, level: Int, id: Int) : CFGNode<FirClass<*>>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitClassExitNode(this, data)
}
}
class LocalClassExitNode(owner: ControlFlowGraph, override val fir: FirRegularClass, level: Int, id: Int) : CFGNode<FirRegularClass>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitLocalClassExitNode(this, data)
}
}
class AnonymousObjectExitNode(owner: ControlFlowGraph, override val fir: FirAnonymousObject, level: Int, id: Int) : CFGNode<FirAnonymousObject>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
@@ -201,3 +201,16 @@ fun ControlFlowGraphBuilder.createAnonymousObjectExitNode(fir: FirAnonymousObjec
fun ControlFlowGraphBuilder.createUnionFunctionCallArgumentsNode(fir: FirElement): UnionFunctionCallArgumentsNode =
UnionFunctionCallArgumentsNode(graph, fir, levelCounter, createId())
fun ControlFlowGraphBuilder.createClassEnterNode(fir: FirClass<*>): ClassEnterNode =
ClassEnterNode(graph, fir, levelCounter, createId()).also {
graph.enterNode = it
}
fun ControlFlowGraphBuilder.createClassExitNode(fir: FirClass<*>): ClassExitNode =
ClassExitNode(graph, fir, levelCounter, createId()).also {
graph.exitNode = it
}
fun ControlFlowGraphBuilder.createLocalClassExitNode(fir: FirRegularClass): LocalClassExitNode =
LocalClassExitNode(graph, fir, levelCounter, createId())
@@ -32,12 +32,24 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
return visitNode(node, data)
}
// ----------------------------------- Anonymous object -----------------------------------
// ----------------------------------- Classes -----------------------------------
open fun visitAnonymousObjectExitNode(node: AnonymousObjectExitNode, data: D): R {
return visitNode(node, data)
}
open fun visitClassEnterNode(node: ClassEnterNode, data: D): R {
return visitNode(node, data)
}
open fun visitClassExitNode(node: ClassExitNode, data: D): R {
return visitNode(node, data)
}
open fun visitLocalClassExitNode(node: LocalClassExitNode, data: D): R {
return visitNode(node, data)
}
// ----------------------------------- Property -----------------------------------
open fun visitPropertyInitializerEnterNode(node: PropertyInitializerEnterNode, data: D): R {