FIR: Fork flow for anonymous initializer

This commit is contained in:
Denis Zharkov
2020-03-23 13:28:26 +03:00
parent f119839891
commit 0ca45deeef
2 changed files with 10 additions and 3 deletions
@@ -915,7 +915,13 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
// ----------------------------------- Init block -----------------------------------
fun enterInitBlock(initBlock: FirAnonymousInitializer) {
graphBuilder.enterInitBlock(initBlock).mergeIncomingFlow()
graphBuilder.enterInitBlock(initBlock).let { (node, prevNode) ->
if (prevNode != null) {
node.flow = logicSystem.forkFlow(prevNode.flow)
} else {
node.mergeIncomingFlow()
}
}
}
fun exitInitBlock(initBlock: FirAnonymousInitializer) {
@@ -728,7 +728,8 @@ class ControlFlowGraphBuilder {
// ----------------------------------- Block -----------------------------------
fun enterInitBlock(initBlock: FirAnonymousInitializer): InitBlockEnterNode {
fun enterInitBlock(initBlock: FirAnonymousInitializer): Pair<InitBlockEnterNode, CFGNode<*>?> {
val lastNode = lastNodes.topOrNull()
graphs.push(ControlFlowGraph(initBlock, "init block", ControlFlowGraph.Kind.ClassInitializer))
val enterNode = createInitBlockEnterNode(initBlock).also {
lexicalScopes.push(stackOf(it))
@@ -737,7 +738,7 @@ class ControlFlowGraphBuilder {
initBlockExitNodes.push(exitNode)
exitNodes.push(exitNode)
levelCounter++
return enterNode
return enterNode to lastNode
}
fun exitInitBlock(initBlock: FirAnonymousInitializer): InitBlockExitNode {