FIR CFA: use a common fake node for annotation calls and contracts
The graphs for both will be completely discarded and should never be visited.
This commit is contained in:
@@ -747,18 +747,6 @@ class StubNode(owner: ControlFlowGraph, level: Int, id: Int) : CFGNode<FirStub>(
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(CfgInternals::class)
|
||||
class ContractDescriptionEnterNode(owner: ControlFlowGraph, level: Int, id: Int) : CFGNode<FirStub>(owner, level, id) {
|
||||
init {
|
||||
owner.enterNode = this
|
||||
}
|
||||
|
||||
override val fir: FirStub = FirStub
|
||||
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
|
||||
return visitor.visitContractDescriptionEnterNode(this, data)
|
||||
}
|
||||
}
|
||||
|
||||
class VariableDeclarationNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int, id: Int) : CFGNode<FirProperty>(owner, level, id) {
|
||||
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
|
||||
return visitor.visitVariableDeclarationNode(this, data)
|
||||
@@ -813,32 +801,6 @@ class WhenSubjectExpressionExitNode(owner: ControlFlowGraph, override val fir: F
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------- Other -----------------------------------
|
||||
|
||||
@OptIn(CfgInternals::class)
|
||||
class AnnotationEnterNode(owner: ControlFlowGraph, override val fir: FirAnnotation, level: Int, id: Int) : CFGNode<FirAnnotation>(owner, level, id),
|
||||
EnterNodeMarker {
|
||||
init {
|
||||
owner.enterNode = this
|
||||
}
|
||||
|
||||
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
|
||||
return visitor.visitAnnotationEnterNode(this, data)
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(CfgInternals::class)
|
||||
class AnnotationExitNode(owner: ControlFlowGraph, override val fir: FirAnnotation, level: Int, id: Int) : CFGNode<FirAnnotation>(owner, level, id),
|
||||
ExitNodeMarker {
|
||||
init {
|
||||
owner.exitNode = this
|
||||
}
|
||||
|
||||
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
|
||||
return visitor.visitAnnotationExitNode(this, data)
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------- Stub -----------------------------------
|
||||
|
||||
object FirStub : FirExpression() {
|
||||
@@ -853,6 +815,16 @@ object FirStub : FirExpression() {
|
||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) { assert(newTypeRef.isNothing) }
|
||||
}
|
||||
|
||||
class FakeExpressionEnterNode(owner: ControlFlowGraph, level: Int, id: Int) : CFGNode<FirStub>(owner, level, id) {
|
||||
init { isDead = true }
|
||||
|
||||
override val fir: FirStub = FirStub
|
||||
|
||||
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
|
||||
throw IllegalStateException("fake expressions should not appear in graphs")
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------- Smart-cast node -----------------------------------
|
||||
|
||||
class SmartCastExpressionExitNode(owner: ControlFlowGraph, override val fir: FirSmartCastExpression, level: Int, id: Int) : CFGNode<FirSmartCastExpression>(owner, level, id) {
|
||||
|
||||
+1
-3
@@ -90,8 +90,6 @@ fun CFGNode<*>.render(): String =
|
||||
is FieldInitializerExitNode -> "Exit field"
|
||||
is InitBlockEnterNode -> "Enter init block"
|
||||
is InitBlockExitNode -> "Exit init block"
|
||||
is AnnotationEnterNode -> "Enter annotation"
|
||||
is AnnotationExitNode -> "Exit annotation"
|
||||
|
||||
is EnterSafeCallNode -> "Enter safe call"
|
||||
is ExitSafeCallNode -> "Exit safe call"
|
||||
@@ -113,7 +111,7 @@ fun CFGNode<*>.render(): String =
|
||||
is ScriptEnterNode -> "Enter class ${fir.name}"
|
||||
is ScriptExitNode -> "Exit class ${fir.name}"
|
||||
|
||||
is ContractDescriptionEnterNode -> "Enter contract description"
|
||||
is FakeExpressionEnterNode -> "Enter fake expression"
|
||||
|
||||
is EnterValueParameterNode -> "Enter default value of ${fir.name}"
|
||||
is EnterDefaultArgumentsNode -> "Enter default value of ${fir.name}"
|
||||
|
||||
+1
-1
@@ -68,7 +68,7 @@ class ControlFlowGraph(val declaration: FirDeclaration?, val name: String, val k
|
||||
PropertyInitializer(withBody = true),
|
||||
FieldInitializer(withBody = true),
|
||||
TopLevel(withBody = false),
|
||||
AnnotationCall(withBody = true),
|
||||
FakeCall(withBody = true),
|
||||
DefaultArgument(withBody = true),
|
||||
Stub(withBody = false)
|
||||
}
|
||||
|
||||
-12
@@ -347,10 +347,6 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
open fun visitContractDescriptionEnterNode(node: ContractDescriptionEnterNode, data: D): R {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
open fun visitVariableDeclarationNode(node: VariableDeclarationNode, data: D): R {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
@@ -391,14 +387,6 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
|
||||
|
||||
// ----------------------------------- Other -----------------------------------
|
||||
|
||||
open fun visitAnnotationEnterNode(node: AnnotationEnterNode, data: D): R {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
open fun visitAnnotationExitNode(node: AnnotationExitNode, data: D): R {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
open fun visitSmartCastExpressionExitNode(node: SmartCastExpressionExitNode, data: D): R {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
-20
@@ -291,16 +291,6 @@ abstract class ControlFlowGraphVisitorVoid : ControlFlowGraphVisitor<Unit, Nothi
|
||||
visitNode(node)
|
||||
}
|
||||
|
||||
// ----------------------------------- Other -----------------------------------
|
||||
|
||||
open fun visitAnnotationEnterNode(node: AnnotationEnterNode) {
|
||||
visitNode(node)
|
||||
}
|
||||
|
||||
open fun visitAnnotationExitNode(node: AnnotationExitNode) {
|
||||
visitNode(node)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
final override fun visitNode(node: CFGNode<*>, data: Nothing?) {
|
||||
@@ -591,14 +581,4 @@ abstract class ControlFlowGraphVisitorVoid : ControlFlowGraphVisitor<Unit, Nothi
|
||||
final override fun visitExitSafeCallNode(node: ExitSafeCallNode, data: Nothing?) {
|
||||
visitExitSafeCallNode(node)
|
||||
}
|
||||
|
||||
// ----------------------------------- Other -----------------------------------
|
||||
|
||||
final override fun visitAnnotationEnterNode(node: AnnotationEnterNode, data: Nothing?) {
|
||||
visitAnnotationEnterNode(node)
|
||||
}
|
||||
|
||||
final override fun visitAnnotationExitNode(node: AnnotationExitNode, data: Nothing?) {
|
||||
visitAnnotationExitNode(node)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user