
org.jetbrains.kotlin.fir.resolve.dfa.Stack.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.resolve.dfa
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
interface Stack {
val size: Int
fun top(): T
fun pop(): T
fun push(value: T)
}
fun stackOf(vararg values: T): Stack = StackImpl(*values)
val Stack<*>.isEmpty: Boolean get() = size == 0
val Stack<*>.isNotEmpty: Boolean get() = size != 0
fun Stack.topOrNull(): T? = if (size == 0) null else top()
private class StackImpl(vararg values: T) : Stack {
private val stack = mutableListOf(*values)
override fun top(): T = stack[stack.size - 1]
override fun pop(): T = stack.removeAt(stack.size - 1)
override fun push(value: T) {
stack.add(value)
}
override val size: Int get() = stack.size
}
class NodeStorage>() : Stack {
private val stack: Stack = StackImpl()
private val map: MutableMap = 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]
}
}
class SymbolBasedNodeStorage> : Stack where T : FirElement {
private val stack: Stack = StackImpl()
private val map: MutableMap, 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 FirSymbolOwner<*>).symbol)
}
override fun push(value: N) {
stack.push(value)
map[(value.fir as FirSymbolOwner<*>).symbol] = value
}
operator fun get(key: FirBasedSymbol<*>): N? {
return map[key]
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy