FIR CFA: add control flow between default parameter values
function enter -> default 1 -> default 2 -> rest of function
\----------^ \----------^
This probably has no effect (in non-stupid code, at least), but it makes
graph construction more architecturally correct (now value parameters'
subgraphs get attached to a node).
This commit is contained in:
@@ -182,8 +182,14 @@ class LocalFunctionDeclarationNode(owner: ControlFlowGraph, override val fir: Fi
|
||||
|
||||
// ----------------------------------- Default arguments -----------------------------------
|
||||
|
||||
class EnterValueParameterNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNodeWithCfgOwner<FirValueParameter>(owner, level, id) {
|
||||
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
|
||||
return visitor.visitEnterValueParameterNode(this, data)
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(CfgInternals::class)
|
||||
class EnterDefaultArgumentsNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNodeWithCfgOwner<FirValueParameter>(owner, level, id),
|
||||
class EnterDefaultArgumentsNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNode<FirValueParameter>(owner, level, id),
|
||||
EnterNodeMarker {
|
||||
init {
|
||||
owner.enterNode = this
|
||||
@@ -206,6 +212,12 @@ class ExitDefaultArgumentsNode(owner: ControlFlowGraph, override val fir: FirVal
|
||||
}
|
||||
}
|
||||
|
||||
class ExitValueParameterNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNode<FirValueParameter>(owner, level, id) {
|
||||
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
|
||||
return visitor.visitExitValueParameterNode(this, data)
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------- Anonymous function -----------------------------------
|
||||
|
||||
class SplitPostponedLambdasNode(owner: ControlFlowGraph, override val fir: FirStatement, val lambdas: List<FirAnonymousFunction>, level: Int, id: Int)
|
||||
|
||||
@@ -115,8 +115,10 @@ fun CFGNode<*>.render(): String =
|
||||
|
||||
is ContractDescriptionEnterNode -> "Enter contract description"
|
||||
|
||||
is EnterValueParameterNode -> "Enter default value of ${fir.name}"
|
||||
is EnterDefaultArgumentsNode -> "Enter default value of ${fir.name}"
|
||||
is ExitDefaultArgumentsNode -> "Exit default value of ${fir.name}"
|
||||
is ExitValueParameterNode -> "Exit default value of ${fir.name}"
|
||||
|
||||
is ElvisLhsExitNode -> "Exit lhs of ?:"
|
||||
is ElvisLhsIsNotNullNode -> "Lhs of ?: is not null"
|
||||
|
||||
+9
-1
@@ -26,7 +26,7 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
|
||||
|
||||
// ----------------------------------- Default arguments -----------------------------------
|
||||
|
||||
open fun visitExitDefaultArgumentsNode(node: ExitDefaultArgumentsNode, data: D): R {
|
||||
open fun visitEnterValueParameterNode(node: EnterValueParameterNode, data: D): R {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
@@ -34,6 +34,14 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
open fun visitExitDefaultArgumentsNode(node: ExitDefaultArgumentsNode, data: D): R {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
open fun visitExitValueParameterNode(node: ExitValueParameterNode, data: D): R {
|
||||
return visitNode(node, data)
|
||||
}
|
||||
|
||||
// ----------------------------------- Anonymous function -----------------------------------
|
||||
|
||||
open fun visitSplitPostponedLambdasNode(node: SplitPostponedLambdasNode, data: D): R {
|
||||
|
||||
Reference in New Issue
Block a user