steel/compiler/passes/
manager.rs1use 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}