[FIR] Add FirCodeFragment

This commit is contained in:
Vasily Levchenko
2023-06-13 15:48:27 +09:00
committed by Yan Zhulanow
parent 2760a25e2c
commit 33abe75a74
23 changed files with 320 additions and 5 deletions
@@ -87,3 +87,7 @@ var FirConstructor.originalConstructorIfTypeAlias: FirConstructor? by FirDeclara
val FirConstructorSymbol.isTypeAliasedConstructor: Boolean
get() = fir.originalConstructorIfTypeAlias != null
private object CodeFragmentTowerDataContext : FirDeclarationDataKey()
var FirCodeFragment.towerDataContext: FirTowerDataContext? by FirDeclarationDataRegistry.data(CodeFragmentTowerDataContext)
@@ -300,6 +300,19 @@ class ScriptExitNode(owner: ControlFlowGraph, override val fir: FirScript, level
}
}
// ----------------------------------- Code Fragments ------------------------------------------
class CodeFragmentEnterNode(owner: ControlFlowGraph, override val fir: FirCodeFragment, level: Int) : CFGNode<FirCodeFragment>(owner, level), GraphEnterNodeMarker {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitCodeFragmentEnterNode(this, data)
}
}
class CodeFragmentExitNode(owner: ControlFlowGraph, override val fir: FirCodeFragment, level: Int) : CFGNode<FirCodeFragment>(owner, level), GraphExitNodeMarker {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitCodeFragmentExitNode(this, data)
}
}
// ----------------------------------- Property -----------------------------------
class PropertyInitializerEnterNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int) : CFGNode<FirProperty>(owner, level),
@@ -106,6 +106,9 @@ fun CFGNode<*>.render(): String =
is ScriptEnterNode -> "Enter class ${fir.name}"
is ScriptExitNode -> "Exit class ${fir.name}"
is CodeFragmentEnterNode -> "Enter code fragment"
is CodeFragmentExitNode -> "Exit code fragment"
is FakeExpressionEnterNode -> "Enter fake expression"
is EnterValueParameterNode -> "Enter default value of ${fir.name}"
@@ -90,6 +90,16 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
return visitNode(node, data)
}
// ----------------------------------- Code Fragments ------------------------------------------
open fun visitCodeFragmentEnterNode(node: CodeFragmentEnterNode, data: D): R {
return visitNode(node, data)
}
open fun visitCodeFragmentExitNode(node: CodeFragmentExitNode, data: D): R {
return visitNode(node, data)
}
// ----------------------------------- Property -----------------------------------
open fun visitPropertyInitializerEnterNode(node: PropertyInitializerEnterNode, data: D): R {