Simplify helper methods in SymbolTable auxiliary classes
This commit is contained in:
@@ -32,39 +32,28 @@ class SymbolTable {
|
|||||||
protected abstract fun get(d: D): S?
|
protected abstract fun get(d: D): S?
|
||||||
protected abstract fun set(d: D, s: S)
|
protected abstract fun set(d: D, s: S)
|
||||||
|
|
||||||
fun markAsUnbound(s: S) {
|
|
||||||
assert(unboundSymbols.add(s)) {
|
|
||||||
"Symbol for ${s.descriptor} was already referenced"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun markAsBound(s: S) {
|
|
||||||
unboundSymbols.remove(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun declare(d: D, createSymbol: () -> S, createOwner: (S) -> B): B {
|
inline fun declare(d: D, createSymbol: () -> S, createOwner: (S) -> B): B {
|
||||||
val symbol = getOrCreateSymbol(d, createSymbol)
|
|
||||||
val owner = createOwner(symbol)
|
|
||||||
return owner
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun getOrCreateSymbol(d: D, createSymbol: () -> S): S {
|
|
||||||
val existing = get(d)
|
val existing = get(d)
|
||||||
return if (existing == null) {
|
val symbol = if (existing == null) {
|
||||||
val new = createSymbol()
|
val new = createSymbol()
|
||||||
set(d, new)
|
set(d, new)
|
||||||
new
|
new
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
markAsBound(existing)
|
unboundSymbols.remove(existing)
|
||||||
existing
|
existing
|
||||||
}
|
}
|
||||||
|
val owner = createOwner(symbol)
|
||||||
|
return owner
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun referenced(d: D, createSymbol: () -> S): S {
|
inline fun referenced(d: D, createSymbol: () -> S): S {
|
||||||
val s = get(d)
|
val s = get(d)
|
||||||
if (s == null) {
|
if (s == null) {
|
||||||
val new = createSymbol().also { markAsUnbound(it) }
|
val new = createSymbol()
|
||||||
|
assert(unboundSymbols.add(new)) {
|
||||||
|
"Symbol for ${new.descriptor} was already referenced"
|
||||||
|
}
|
||||||
set(d, new)
|
set(d, new)
|
||||||
return new
|
return new
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user