Skip to main content

hierarchy_visit_emit/
hierarchy_visit_emit.rs

1use m2_syn::visit::Visit;
2use m2_syn::{AnyCell, CellNode, ParseError, SourceId, Symbol, ToTokens, parse_tokens, quote_m2};
3
4fn require_cell<T: CellNode>(_cell: &T) {}
5
6#[derive(Default)]
7struct SymbolCollector {
8    symbols: Vec<String>,
9}
10
11impl<'ast> Visit<'ast> for SymbolCollector {
12    fn visit_symbol(&mut self, symbol: &'ast Symbol) {
13        self.symbols.push(symbol.text.clone());
14    }
15}
16
17fn main() -> Result<(), ParseError> {
18    let quoted = quote_m2! {
19        left + right 2
20    };
21    let source_file = parse_tokens(&quoted, SourceId(1))?;
22    let AnyCell::ExpressionCell(cell) = &source_file.elements[0] else {
23        panic!("quoted expression did not reconstruct as an ExpressionCell");
24    };
25    require_cell(cell);
26
27    let mut collector = SymbolCollector::default();
28    collector.visit_source_file(&source_file);
29
30    println!("hierarchy: CellNode -> ExpressionCell -> AnyCell -> SourceFile");
31    println!("visited: {}", collector.symbols.join(", "));
32    print!("generated: {}", source_file.to_code());
33    Ok(())
34}