From 1180ec54ef4130fd02cd87e125c9aab132557549 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 28 Jan 2020 14:12:53 +0300 Subject: [PATCH] [FIR] Add unique id's for nodes of control flow graph --- .../fir/resolve/dfa/cfg/ControlFlowGraph.kt | 131 ++++++++++-------- .../dfa/cfg/ControlFlowGraphBuilder.kt | 4 + .../dfa/cfg/ControlFlowGraphNodeBuilder.kt | 112 +++++++-------- 3 files changed, 130 insertions(+), 117 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt index d17da577d7c..9ec9825ed7c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt @@ -24,7 +24,7 @@ class ControlFlowGraph(val name: String, val kind: Kind) { } } -sealed class CFGNode(val owner: ControlFlowGraph, val level: Int) { +sealed class CFGNode(val owner: ControlFlowGraph, val level: Int, private val id: Int) { init { owner.nodes += this } @@ -34,6 +34,15 @@ sealed class CFGNode(val owner: ControlFlowGraph, val level: abstract val fir: E var isDead: Boolean = false + + final override fun equals(other: Any?): Boolean { + if (other !is CFGNode<*>) return false + return this.id == other.id + } + + final override fun hashCode(): Int { + return id + } } val CFGNode<*>.aliveFollowingNodes: List> get() = if (isDead) followingNodes else followingNodes.filterNot { it.isDead } @@ -44,33 +53,33 @@ interface ExitNode // ----------------------------------- Named function ----------------------------------- -class FunctionEnterNode(owner: ControlFlowGraph, override val fir: FirFunction<*>, level: Int) : CFGNode>(owner, level), EnterNode -class FunctionExitNode(owner: ControlFlowGraph, override val fir: FirFunction<*>, level: Int) : CFGNode>(owner, level), ExitNode +class FunctionEnterNode(owner: ControlFlowGraph, override val fir: FirFunction<*>, level: Int, id: Int) : CFGNode>(owner, level, id), EnterNode +class FunctionExitNode(owner: ControlFlowGraph, override val fir: FirFunction<*>, level: Int, id: Int) : CFGNode>(owner, level, id), ExitNode // ----------------------------------- Property ----------------------------------- -class PropertyInitializerEnterNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int) : CFGNode(owner, level), EnterNode -class PropertyInitializerExitNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int) : CFGNode(owner, level), ExitNode +class PropertyInitializerEnterNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class PropertyInitializerExitNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode // ----------------------------------- Init ----------------------------------- -class InitBlockEnterNode(owner: ControlFlowGraph, override val fir: FirAnonymousInitializer, level: Int) : CFGNode(owner, level), EnterNode -class InitBlockExitNode(owner: ControlFlowGraph, override val fir: FirAnonymousInitializer, level: Int) : CFGNode(owner, level), ExitNode +class InitBlockEnterNode(owner: ControlFlowGraph, override val fir: FirAnonymousInitializer, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class InitBlockExitNode(owner: ControlFlowGraph, override val fir: FirAnonymousInitializer, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode // ----------------------------------- Block ----------------------------------- -class BlockEnterNode(owner: ControlFlowGraph, override val fir: FirBlock, level: Int) : CFGNode(owner, level), EnterNode -class BlockExitNode(owner: ControlFlowGraph, override val fir: FirBlock, level: Int) : CFGNode(owner, level), ExitNode +class BlockEnterNode(owner: ControlFlowGraph, override val fir: FirBlock, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class BlockExitNode(owner: ControlFlowGraph, override val fir: FirBlock, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode // ----------------------------------- When ----------------------------------- -class WhenEnterNode(owner: ControlFlowGraph, override val fir: FirWhenExpression, level: Int) : CFGNode(owner, level), EnterNode -class WhenExitNode(owner: ControlFlowGraph, override val fir: FirWhenExpression, level: Int) : CFGNode(owner, level), ExitNode -class WhenBranchConditionEnterNode(owner: ControlFlowGraph, override val fir: FirWhenBranch, level: Int) : CFGNode(owner, level), EnterNode -class WhenBranchConditionExitNode(owner: ControlFlowGraph, override val fir: FirWhenBranch, level: Int) : CFGNode(owner, level), ExitNode -class WhenBranchResultEnterNode(owner: ControlFlowGraph, override val fir: FirWhenBranch, level: Int) : CFGNode(owner, level) -class WhenBranchResultExitNode(owner: ControlFlowGraph, override val fir: FirWhenBranch, level: Int) : CFGNode(owner, level) -class WhenSyntheticElseBranchNode(owner: ControlFlowGraph, override val fir: FirWhenExpression, level: Int) : CFGNode(owner, level) { +class WhenEnterNode(owner: ControlFlowGraph, override val fir: FirWhenExpression, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class WhenExitNode(owner: ControlFlowGraph, override val fir: FirWhenExpression, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode +class WhenBranchConditionEnterNode(owner: ControlFlowGraph, override val fir: FirWhenBranch, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class WhenBranchConditionExitNode(owner: ControlFlowGraph, override val fir: FirWhenBranch, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode +class WhenBranchResultEnterNode(owner: ControlFlowGraph, override val fir: FirWhenBranch, level: Int, id: Int) : CFGNode(owner, level, id) +class WhenBranchResultExitNode(owner: ControlFlowGraph, override val fir: FirWhenBranch, level: Int, id: Int) : CFGNode(owner, level, id) +class WhenSyntheticElseBranchNode(owner: ControlFlowGraph, override val fir: FirWhenExpression, level: Int, id: Int) : CFGNode(owner, level, id) { init { assert(!fir.isExhaustive) } @@ -78,78 +87,78 @@ class WhenSyntheticElseBranchNode(owner: ControlFlowGraph, override val fir: Fir // ----------------------------------- Loop ----------------------------------- -class LoopEnterNode(owner: ControlFlowGraph, override val fir: FirLoop, level: Int) : CFGNode(owner, level), EnterNode -class LoopBlockEnterNode(owner: ControlFlowGraph, override val fir: FirLoop, level: Int) : CFGNode(owner, level), EnterNode -class LoopBlockExitNode(owner: ControlFlowGraph, override val fir: FirLoop, level: Int) : CFGNode(owner, level), ExitNode -class LoopConditionEnterNode(owner: ControlFlowGraph, override val fir: FirExpression, level: Int) : CFGNode(owner, level), EnterNode -class LoopConditionExitNode(owner: ControlFlowGraph, override val fir: FirExpression, level: Int) : CFGNode(owner, level), ExitNode -class LoopExitNode(owner: ControlFlowGraph, override val fir: FirLoop, level: Int) : CFGNode(owner, level), ExitNode +class LoopEnterNode(owner: ControlFlowGraph, override val fir: FirLoop, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class LoopBlockEnterNode(owner: ControlFlowGraph, override val fir: FirLoop, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class LoopBlockExitNode(owner: ControlFlowGraph, override val fir: FirLoop, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode +class LoopConditionEnterNode(owner: ControlFlowGraph, override val fir: FirExpression, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class LoopConditionExitNode(owner: ControlFlowGraph, override val fir: FirExpression, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode +class LoopExitNode(owner: ControlFlowGraph, override val fir: FirLoop, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode // ----------------------------------- Try-catch-finally ----------------------------------- -class TryExpressionEnterNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int) : CFGNode(owner, level), EnterNode -class TryMainBlockEnterNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int) : CFGNode(owner, level), EnterNode -class TryMainBlockExitNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int) : CFGNode(owner, level), ExitNode -class CatchClauseEnterNode(owner: ControlFlowGraph, override val fir: FirCatch, level: Int) : CFGNode(owner, level), EnterNode -class CatchClauseExitNode(owner: ControlFlowGraph, override val fir: FirCatch, level: Int) : CFGNode(owner, level), ExitNode -class FinallyBlockEnterNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int) : CFGNode(owner, level), EnterNode -class FinallyBlockExitNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int) : CFGNode(owner, level), ExitNode -class FinallyProxyEnterNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int) : CFGNode(owner, level), EnterNode -class FinallyProxyExitNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int) : CFGNode(owner, level), ExitNode -class TryExpressionExitNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int) : CFGNode(owner, level), ExitNode +class TryExpressionEnterNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class TryMainBlockEnterNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class TryMainBlockExitNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode +class CatchClauseEnterNode(owner: ControlFlowGraph, override val fir: FirCatch, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class CatchClauseExitNode(owner: ControlFlowGraph, override val fir: FirCatch, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode +class FinallyBlockEnterNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class FinallyBlockExitNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode +class FinallyProxyEnterNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class FinallyProxyExitNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode +class TryExpressionExitNode(owner: ControlFlowGraph, override val fir: FirTryExpression, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode // ----------------------------------- Boolean operators ----------------------------------- -abstract class AbstractBinaryExitNode(owner: ControlFlowGraph, level: Int) : CFGNode(owner, level) { +abstract class AbstractBinaryExitNode(owner: ControlFlowGraph, level: Int, id: Int) : CFGNode(owner, level, id) { val leftOperandNode: CFGNode<*> get() = previousNodes[0] val rightOperandNode: CFGNode<*> get() = previousNodes[1] } -class BinaryAndEnterNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int) : CFGNode(owner, level), EnterNode -class BinaryAndExitLeftOperandNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int) : CFGNode(owner, level) -class BinaryAndEnterRightOperandNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int) : CFGNode(owner, level) -class BinaryAndExitNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int) : AbstractBinaryExitNode(owner, level), ExitNode +class BinaryAndEnterNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class BinaryAndExitLeftOperandNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int, id: Int) : CFGNode(owner, level, id) +class BinaryAndEnterRightOperandNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int, id: Int) : CFGNode(owner, level, id) +class BinaryAndExitNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int, id: Int) : AbstractBinaryExitNode(owner, level, id), ExitNode -class BinaryOrEnterNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int) : CFGNode(owner, level), EnterNode -class BinaryOrExitLeftOperandNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int) : CFGNode(owner, level) -class BinaryOrEnterRightOperandNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int) : CFGNode(owner, level) -class BinaryOrExitNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int) : AbstractBinaryExitNode(owner, level), ExitNode +class BinaryOrEnterNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class BinaryOrExitLeftOperandNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int, id: Int) : CFGNode(owner, level, id) +class BinaryOrEnterRightOperandNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int, id: Int) : CFGNode(owner, level, id) +class BinaryOrExitNode(owner: ControlFlowGraph, override val fir: FirBinaryLogicExpression, level: Int, id: Int) : AbstractBinaryExitNode(owner, level, id), ExitNode // ----------------------------------- Operator call ----------------------------------- -class TypeOperatorCallNode(owner: ControlFlowGraph, override val fir: FirTypeOperatorCall, level: Int) : CFGNode(owner, level) -class OperatorCallNode(owner: ControlFlowGraph, override val fir: FirOperatorCall, level: Int) : AbstractBinaryExitNode(owner, level) +class TypeOperatorCallNode(owner: ControlFlowGraph, override val fir: FirTypeOperatorCall, level: Int, id: Int) : CFGNode(owner, level, id) +class OperatorCallNode(owner: ControlFlowGraph, override val fir: FirOperatorCall, level: Int, id: Int) : AbstractBinaryExitNode(owner, level, id) // ----------------------------------- Jump ----------------------------------- -class JumpNode(owner: ControlFlowGraph, override val fir: FirJump<*>, level: Int) : CFGNode>(owner, level) -class ConstExpressionNode(owner: ControlFlowGraph, override val fir: FirConstExpression<*>, level: Int) : CFGNode>(owner, level) +class JumpNode(owner: ControlFlowGraph, override val fir: FirJump<*>, level: Int, id: Int) : CFGNode>(owner, level, id) +class ConstExpressionNode(owner: ControlFlowGraph, override val fir: FirConstExpression<*>, level: Int, id: Int) : CFGNode>(owner, level, id) // ----------------------------------- Check not null call ----------------------------------- -class CheckNotNullCallNode(owner: ControlFlowGraph, override val fir: FirCheckNotNullCall, level: Int) : CFGNode(owner, level) +class CheckNotNullCallNode(owner: ControlFlowGraph, override val fir: FirCheckNotNullCall, level: Int, id: Int) : CFGNode(owner, level, id) // ----------------------------------- Resolvable call ----------------------------------- class QualifiedAccessNode( owner: ControlFlowGraph, override val fir: FirQualifiedAccessExpression, - level: Int -) : CFGNode(owner, level) + level: Int, id: Int +) : CFGNode(owner, level, id) class FunctionCallNode( owner: ControlFlowGraph, override val fir: FirFunctionCall, - level: Int -) : CFGNode(owner, level) + level: Int, id: Int +) : CFGNode(owner, level, id) class ThrowExceptionNode( owner: ControlFlowGraph, override val fir: FirThrowExpression, - level: Int -) : CFGNode(owner, level) + level: Int, id: Int +) : CFGNode(owner, level, id) -class StubNode(owner: ControlFlowGraph, level: Int) : CFGNode(owner, level) { +class StubNode(owner: ControlFlowGraph, level: Int, id: Int) : CFGNode(owner, level, id) { init { isDead = true } @@ -157,19 +166,19 @@ class StubNode(owner: ControlFlowGraph, level: Int) : CFGNode(owner, le override val fir: FirStub get() = FirStub } -class VariableDeclarationNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int) : CFGNode(owner, level) -class VariableAssignmentNode(owner: ControlFlowGraph, override val fir: FirVariableAssignment, level: Int) : CFGNode(owner, level) +class VariableDeclarationNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int, id: Int) : CFGNode(owner, level, id) +class VariableAssignmentNode(owner: ControlFlowGraph, override val fir: FirVariableAssignment, level: Int, id: Int) : CFGNode(owner, level, id) -class EnterContractNode(owner: ControlFlowGraph, override val fir: FirFunctionCall, level: Int) : CFGNode(owner, level), EnterNode -class ExitContractNode(owner: ControlFlowGraph, override val fir: FirFunctionCall, level: Int) : CFGNode(owner, level), ExitNode +class EnterContractNode(owner: ControlFlowGraph, override val fir: FirFunctionCall, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class ExitContractNode(owner: ControlFlowGraph, override val fir: FirFunctionCall, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode -class EnterSafeCallNode(owner: ControlFlowGraph, override val fir: FirQualifiedAccess, level: Int) : CFGNode(owner, level) -class ExitSafeCallNode(owner: ControlFlowGraph, override val fir: FirQualifiedAccess, level: Int) : CFGNode(owner, level) +class EnterSafeCallNode(owner: ControlFlowGraph, override val fir: FirQualifiedAccess, level: Int, id: Int) : CFGNode(owner, level, id) +class ExitSafeCallNode(owner: ControlFlowGraph, override val fir: FirQualifiedAccess, level: Int, id: Int) : CFGNode(owner, level, id) // ----------------------------------- Other ----------------------------------- -class AnnotationEnterNode(owner: ControlFlowGraph, override val fir: FirAnnotationCall, level: Int) : CFGNode(owner, level), EnterNode -class AnnotationExitNode(owner: ControlFlowGraph, override val fir: FirAnnotationCall, level: Int) : CFGNode(owner, level), ExitNode +class AnnotationEnterNode(owner: ControlFlowGraph, override val fir: FirAnnotationCall, level: Int, id: Int) : CFGNode(owner, level, id), EnterNode +class AnnotationExitNode(owner: ControlFlowGraph, override val fir: FirAnnotationCall, level: Int, id: Int) : CFGNode(owner, level, id), ExitNode // ----------------------------------- Stub ----------------------------------- diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index a8673e2f1c9..31c62ead693 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -51,6 +51,10 @@ class ControlFlowGraphBuilder { var levelCounter: Int = 0 private set + private var idCounter: Int = 0 + + fun createId(): Int = idCounter++ + fun isTopLevel(): Boolean = graphs.size == 1 // ----------------------------------- Named function ----------------------------------- diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt index 7ec0271aa3e..45acf717941 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt @@ -10,173 +10,173 @@ import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.expressions.* -fun ControlFlowGraphBuilder.createStubNode(): StubNode = StubNode(graph, levelCounter) +fun ControlFlowGraphBuilder.createStubNode(): StubNode = StubNode(graph, levelCounter, createId()) -fun ControlFlowGraphBuilder.createLoopExitNode(fir: FirLoop): LoopExitNode = LoopExitNode(graph, fir, levelCounter) +fun ControlFlowGraphBuilder.createLoopExitNode(fir: FirLoop): LoopExitNode = LoopExitNode(graph, fir, levelCounter, createId()) -fun ControlFlowGraphBuilder.createLoopEnterNode(fir: FirLoop): LoopEnterNode = LoopEnterNode(graph, fir, levelCounter) +fun ControlFlowGraphBuilder.createLoopEnterNode(fir: FirLoop): LoopEnterNode = LoopEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createInitBlockExitNode(fir: FirAnonymousInitializer): InitBlockExitNode = - InitBlockExitNode(graph, fir, levelCounter) + InitBlockExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createInitBlockEnterNode(fir: FirAnonymousInitializer): InitBlockEnterNode = - InitBlockEnterNode(graph, fir, levelCounter) + InitBlockEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTypeOperatorCallNode(fir: FirTypeOperatorCall): TypeOperatorCallNode = - TypeOperatorCallNode(graph, fir, levelCounter) + TypeOperatorCallNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createOperatorCallNode(fir: FirOperatorCall): OperatorCallNode = - OperatorCallNode(graph, fir, levelCounter) + OperatorCallNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenBranchConditionExitNode(fir: FirWhenBranch): WhenBranchConditionExitNode = - WhenBranchConditionExitNode(graph, fir, levelCounter) + WhenBranchConditionExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createJumpNode(fir: FirJump<*>): JumpNode = - JumpNode(graph, fir, levelCounter) + JumpNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createCheckNotNullCallNode(fir: FirCheckNotNullCall): CheckNotNullCallNode = - CheckNotNullCallNode(graph, fir, levelCounter) + CheckNotNullCallNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createQualifiedAccessNode(fir: FirQualifiedAccessExpression): QualifiedAccessNode = - QualifiedAccessNode(graph, fir, levelCounter) + QualifiedAccessNode(graph, fir, levelCounter, createId()) -fun ControlFlowGraphBuilder.createBlockEnterNode(fir: FirBlock): BlockEnterNode = BlockEnterNode(graph, fir, levelCounter) +fun ControlFlowGraphBuilder.createBlockEnterNode(fir: FirBlock): BlockEnterNode = BlockEnterNode(graph, fir, levelCounter, createId()) -fun ControlFlowGraphBuilder.createBlockExitNode(fir: FirBlock): BlockExitNode = BlockExitNode(graph, fir, levelCounter) +fun ControlFlowGraphBuilder.createBlockExitNode(fir: FirBlock): BlockExitNode = BlockExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createPropertyInitializerExitNode(fir: FirProperty): PropertyInitializerExitNode = - PropertyInitializerExitNode(graph, fir, levelCounter) + PropertyInitializerExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createPropertyInitializerEnterNode(fir: FirProperty): PropertyInitializerEnterNode = - PropertyInitializerEnterNode(graph, fir, levelCounter) + PropertyInitializerEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFunctionEnterNode(fir: FirFunction<*>, isInPlace: Boolean): FunctionEnterNode = - FunctionEnterNode(graph, fir, levelCounter).also { + FunctionEnterNode(graph, fir, levelCounter, createId()).also { if (!isInPlace) { graph.enterNode = it } } fun ControlFlowGraphBuilder.createFunctionExitNode(fir: FirFunction<*>, isInPlace: Boolean): FunctionExitNode = - FunctionExitNode(graph, fir, levelCounter).also { + FunctionExitNode(graph, fir, levelCounter, createId()).also { if (!isInPlace) { graph.exitNode = it } } fun ControlFlowGraphBuilder.createBinaryOrEnterNode(fir: FirBinaryLogicExpression): BinaryOrEnterNode = - BinaryOrEnterNode(graph, fir, levelCounter) + BinaryOrEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryOrExitLeftOperandNode(fir: FirBinaryLogicExpression): BinaryOrExitLeftOperandNode = - BinaryOrExitLeftOperandNode(graph, fir, levelCounter) + BinaryOrExitLeftOperandNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryOrExitNode(fir: FirBinaryLogicExpression): BinaryOrExitNode = - BinaryOrExitNode(graph, fir, levelCounter) + BinaryOrExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryAndExitNode(fir: FirBinaryLogicExpression): BinaryAndExitNode = - BinaryAndExitNode(graph, fir, levelCounter) + BinaryAndExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryAndEnterNode(fir: FirBinaryLogicExpression): BinaryAndEnterNode = - BinaryAndEnterNode(graph, fir, levelCounter) + BinaryAndEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenBranchConditionEnterNode(fir: FirWhenBranch): WhenBranchConditionEnterNode = - WhenBranchConditionEnterNode(graph, fir, levelCounter) + WhenBranchConditionEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenEnterNode(fir: FirWhenExpression): WhenEnterNode = - WhenEnterNode(graph, fir, levelCounter) + WhenEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenExitNode(fir: FirWhenExpression): WhenExitNode = - WhenExitNode(graph, fir, levelCounter) + WhenExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenBranchResultExitNode(fir: FirWhenBranch): WhenBranchResultExitNode = - WhenBranchResultExitNode(graph, fir, levelCounter) + WhenBranchResultExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenSyntheticElseBranchNode(fir: FirWhenExpression): WhenSyntheticElseBranchNode = - WhenSyntheticElseBranchNode(graph, fir, levelCounter) + WhenSyntheticElseBranchNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenBranchResultEnterNode(fir: FirWhenBranch): WhenBranchResultEnterNode = - WhenBranchResultEnterNode(graph, fir, levelCounter) + WhenBranchResultEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLoopConditionExitNode(fir: FirExpression): LoopConditionExitNode = - LoopConditionExitNode(graph, fir, levelCounter) + LoopConditionExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLoopConditionEnterNode(fir: FirExpression): LoopConditionEnterNode = - LoopConditionEnterNode(graph, fir, levelCounter) + LoopConditionEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLoopBlockEnterNode(fir: FirLoop): LoopBlockEnterNode = - LoopBlockEnterNode(graph, fir, levelCounter) + LoopBlockEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLoopBlockExitNode(fir: FirLoop): LoopBlockExitNode = - LoopBlockExitNode(graph, fir, levelCounter) + LoopBlockExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFunctionCallNode(fir: FirFunctionCall): FunctionCallNode = - FunctionCallNode(graph, fir, levelCounter) + FunctionCallNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createVariableAssignmentNode(fir: FirVariableAssignment): VariableAssignmentNode = - VariableAssignmentNode(graph, fir, levelCounter) + VariableAssignmentNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createAnnotationExitNode(fir: FirAnnotationCall): AnnotationExitNode = - AnnotationExitNode(graph, fir, levelCounter) + AnnotationExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createAnnotationEnterNode(fir: FirAnnotationCall): AnnotationEnterNode = - AnnotationEnterNode(graph, fir, levelCounter) + AnnotationEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createVariableDeclarationNode(fir: FirProperty): VariableDeclarationNode = - VariableDeclarationNode(graph, fir, levelCounter) + VariableDeclarationNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createExitContractNode(fir: FirFunctionCall): ExitContractNode = - ExitContractNode(graph, fir, levelCounter) + ExitContractNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createEnterContractNode(fir: FirFunctionCall): EnterContractNode = - EnterContractNode(graph, fir, levelCounter) + EnterContractNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createConstExpressionNode(fir: FirConstExpression<*>): ConstExpressionNode = - ConstExpressionNode(graph, fir, levelCounter) + ConstExpressionNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createThrowExceptionNode(fir: FirThrowExpression): ThrowExceptionNode = - ThrowExceptionNode(graph, fir, levelCounter) + ThrowExceptionNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFinallyProxyExitNode(fir: FirTryExpression): FinallyProxyExitNode = - FinallyProxyExitNode(graph, fir, levelCounter) + FinallyProxyExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFinallyProxyEnterNode(fir: FirTryExpression): FinallyProxyEnterNode = - FinallyProxyEnterNode(graph, fir, levelCounter) + FinallyProxyEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFinallyBlockExitNode(fir: FirTryExpression): FinallyBlockExitNode = - FinallyBlockExitNode(graph, fir, levelCounter) + FinallyBlockExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFinallyBlockEnterNode(fir: FirTryExpression): FinallyBlockEnterNode = - FinallyBlockEnterNode(graph, fir, levelCounter) + FinallyBlockEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createCatchClauseExitNode(fir: FirCatch): CatchClauseExitNode = - CatchClauseExitNode(graph, fir, levelCounter) + CatchClauseExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTryMainBlockExitNode(fir: FirTryExpression): TryMainBlockExitNode = - TryMainBlockExitNode(graph, fir, levelCounter) + TryMainBlockExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTryMainBlockEnterNode(fir: FirTryExpression): TryMainBlockEnterNode = - TryMainBlockEnterNode(graph, fir, levelCounter) + TryMainBlockEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createCatchClauseEnterNode(fir: FirCatch): CatchClauseEnterNode = - CatchClauseEnterNode(graph, fir, levelCounter) + CatchClauseEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTryExpressionEnterNode(fir: FirTryExpression): TryExpressionEnterNode = - TryExpressionEnterNode(graph, fir, levelCounter) + TryExpressionEnterNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTryExpressionExitNode(fir: FirTryExpression): TryExpressionExitNode = - TryExpressionExitNode(graph, fir, levelCounter) + TryExpressionExitNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryAndExitLeftOperandNode(fir: FirBinaryLogicExpression): BinaryAndExitLeftOperandNode = - BinaryAndExitLeftOperandNode(graph, fir, levelCounter) + BinaryAndExitLeftOperandNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryAndEnterRightOperandNode(fir: FirBinaryLogicExpression): BinaryAndEnterRightOperandNode = - BinaryAndEnterRightOperandNode(graph, fir, levelCounter) + BinaryAndEnterRightOperandNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryOrEnterRightOperandNode(fir: FirBinaryLogicExpression): BinaryOrEnterRightOperandNode = - BinaryOrEnterRightOperandNode(graph, fir, levelCounter) + BinaryOrEnterRightOperandNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createExitSafeCallNode(fir: FirQualifiedAccess): ExitSafeCallNode = - ExitSafeCallNode(graph, fir, levelCounter) + ExitSafeCallNode(graph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createEnterSafeCallNode(fir: FirQualifiedAccess): EnterSafeCallNode = - EnterSafeCallNode(graph, fir, levelCounter) \ No newline at end of file + EnterSafeCallNode(graph, fir, levelCounter, createId()) \ No newline at end of file