Skip to main content

luaur_reduce_cli/methods/
reducer_walk.rs

1use 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}