Skip to content
← Back

src/semantic/symbol_map.ghul

1
namespace Semantic is
2
use IO.Std;
3
4
class SYMBOL_STORE is
5
_map: Collections.MAP[string,Symbols.Symbol];
6
7
count: int => _map.count;
8
9
values: Collections.Iterable[Symbols.Symbol] => _map.values;
10
11
init() is
12
_map = Collections.MAP[string,Symbols.Symbol]();
13
si
14
15
[name: string]: Symbols.Symbol?
16
=> if _map.contains_key(name) then _map[name] else null fi,
17
= v is
18
_map[name] = v!;
19
si
20
21
add(name: string, value: Symbols.Symbol) is _map.add(name, value); si
22
23
contains_key(name: string) -> bool => _map.contains_key(name);
24
25
remove(name: string) is _map.remove(name); si
26
27
clear() is _map.clear(); si
28
29
find_matches(
30
prefix: string,
31
matches: Collections.MutableMap[string,Semantic.Symbols.Symbol])
32
is
33
if prefix.length == 0 then
34
for p in _map do
35
if !p.value.is_internal then
36
matches[p.key] = p.value;
37
fi
38
od
39
else
40
for p in _map do
41
if p.key.starts_with(prefix) /\ !p.value.is_internal then
42
matches[p.key] = p.value;
43
fi
44
od
45
fi
46
si
47
48
add_match(
49
name: string,
50
match: Semantic.Symbols.Symbol,
51
matches: Collections.MutableMap[string,Semantic.Symbols.Symbol]
52
) static is
53
if !match.is_internal /\ !matches.contains_key(name) then
54
matches[name] = match.collapse_group_if_single_member();
55
fi
56
si
57
si
58
si