steel/compiler/passes/
manager.rs

1use crate::parser::ast::ExprKind;
2
3use super::Folder;
4
5type PassFn = fn() -> Box<dyn Folder>;
6
7pub struct PassManager {
8    passes: Vec<PassFn>,
9}
10
11impl Default for PassManager {
12    fn default() -> Self {
13        Self::new()
14    }
15}
16
17impl PassManager {
18    pub fn new() -> Self {
19        PassManager { passes: Vec::new() }
20    }
21
22    pub fn register_pass(&mut self, pass: PassFn) -> &mut Self {
23        self.passes.push(pass);
24        self
25    }
26
27    pub fn run(&self, mut ast: Vec<ExprKind>) -> Vec<ExprKind> {
28        let mut changed = false;
29        while changed {
30            for thunk in &self.passes {
31                let mut pass = thunk();
32                ast = pass.fold(ast);
33                changed = pass.modified();
34            }
35        }
36        ast
37    }
38}