luaur_reduce_cli/methods/
reducer_walk.rs1use crate::records::enqueuer::Enqueuer;
2use crate::records::reducer::Reducer;
3use luaur_ast::records::ast_stat::AstStat;
4use luaur_ast::records::ast_stat_block::AstStatBlock;
5use luaur_ast::visit::ast_stat_visit;
6use std::collections::VecDeque;
7
8impl Reducer {
9 pub fn walk(&mut self, block: *mut AstStatBlock) {
10 let mut queue: VecDeque<*mut AstStatBlock> = VecDeque::new();
11 let mut enqueuer = Enqueuer::new(&mut queue as *mut VecDeque<*mut AstStatBlock>);
12
13 queue.push_back(block);
14
15 while let Some(b) = queue.pop_front() {
16 loop {
17 let mut result = self.delete_child_statements_ast_stat_block(b);
18 result |= self.try_promoting_child_statements_ast_stat_block(b);
19
20 if !result {
21 break;
22 }
23 }
24
25 unsafe {
26 for stat in (*b).body.as_slice() {
27 ast_stat_visit(*stat as *mut AstStat, &mut enqueuer);
28 }
29 }
30 }
31 }
32}