1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use crate::{
ast::{NodeData, NodeId, NodeMap, Syntax},
source::SourceRange,
symbol::ScopeId,
};
struct NodeUpdate {
node_id: NodeId,
new_data: NodeData,
}
pub struct NodeUpdates {
updates: Vec<NodeUpdate>,
next_new_node_id: usize,
}
impl NodeUpdates {
pub fn new(node_map: &NodeMap) -> NodeUpdates {
NodeUpdates {
updates: vec![],
next_new_node_id: node_map.len(),
}
}
pub fn replace_node(
&mut self,
node_id: NodeId,
scope: ScopeId,
loc: SourceRange,
stx: Syntax,
) -> () {
self.updates.push(NodeUpdate {
node_id,
new_data: NodeData::new(scope, loc, stx),
})
}
pub fn create_node(&mut self, scope: ScopeId, loc: SourceRange, stx: Syntax) -> NodeId {
let node_id = NodeId::new(self.next_new_node_id);
self.next_new_node_id += 1;
self.updates.push(NodeUpdate {
node_id,
new_data: NodeData::new(scope, loc, stx),
});
node_id
}
pub fn apply_updates(self, node_map: &mut NodeMap) -> () {
for u in self.updates {
if u.node_id.id() == node_map.len() {
node_map.push(u.new_data)
} else {
node_map[u.node_id] = u.new_data;
}
}
}
}