FIR CFA: remove some redundant node stacks

Honestly the amount of mutable state in the builder makes me somewhat
uneasy.
This commit is contained in:
pyos
2022-12-12 00:33:29 +01:00
committed by Dmitriy Novozhilov
parent 60662663be
commit 5a79017879
7 changed files with 108 additions and 218 deletions
@@ -5,10 +5,6 @@
package org.jetbrains.kotlin.fir.resolve.dfa
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.util.asReversedFrozen
abstract class Stack<T> {
@@ -47,61 +43,3 @@ private class StackImpl<T>(vararg values: T) : Stack<T>() {
override fun all(): List<T> = stack.asReversedFrozen()
}
class NodeStorage<T : FirElement, N : CFGNode<T>> : Stack<N>(){
private val stack: Stack<N> = StackImpl()
private val map: MutableMap<T, N> = mutableMapOf()
override val size: Int get() = stack.size
override fun top(): N = stack.top()
override fun pop(): N = stack.pop().also {
map.remove(it.fir)
}
override fun push(value: N) {
stack.push(value)
map[value.fir] = value
}
operator fun get(key: T): N? {
return map[key]
}
override fun reset() {
stack.reset()
map.clear()
}
override fun all(): List<N> = stack.all()
}
class SymbolBasedNodeStorage<T, N : CFGNode<T>> : Stack<N>() where T : FirElement {
private val stack: Stack<N> = StackImpl()
private val map: MutableMap<FirBasedSymbol<*>, N> = mutableMapOf()
override val size: Int get() = stack.size
override fun top(): N = stack.top()
override fun pop(): N = stack.pop().also {
map.remove((it.fir as FirDeclaration).symbol)
}
override fun push(value: N) {
stack.push(value)
map[(value.fir as FirDeclaration).symbol] = value
}
operator fun get(key: FirBasedSymbol<*>): N? {
return map[key]
}
override fun reset() {
stack.reset()
map.clear()
}
override fun all(): List<N> = stack.all()
}
@@ -746,7 +746,7 @@ object FirStub : FirExpression() {
override fun replaceTypeRef(newTypeRef: FirTypeRef) { assert(newTypeRef.isNothing) }
}
class FakeExpressionEnterNode(owner: ControlFlowGraph, level: Int) : CFGNode<FirStub>(owner, level) {
class FakeExpressionEnterNode(owner: ControlFlowGraph, level: Int) : CFGNode<FirStub>(owner, level), GraphEnterNodeMarker, GraphExitNodeMarker {
init { isDead = true }
override val fir: FirStub = FirStub
@@ -37,6 +37,7 @@ class ControlFlowGraph(val declaration: FirDeclaration?, val name: String, val k
Class,
Function,
AnonymousFunction,
AnonymousFunctionCalledInPlace,
PropertyInitializer,
FieldInitializer,
FakeCall,