Skip to main content

hierarchy_visit_emit/
hierarchy_visit_emit.rs

1//! Demonstrates hierarchy visit emit.
2
3use m2_syn::nodes::Symbol;
4use m2_syn::visit::Visit;
5use m2_syn::{Lex, ParseError, parse_tokens, quote_m2};
6
7#[derive(Default)]
8/// State used by the SymbolCollector example.
9struct SymbolCollector {
10    /// The symbols.
11    symbols: Vec<String>,
12}
13
14impl<'ast> Visit<'ast> for SymbolCollector {
15    fn visit_symbol(&mut self, symbol: &'ast Symbol) {
16        self.symbols.push(symbol.text().to_owned());
17    }
18}
19
20fn main() -> Result<(), ParseError> {
21    let quoted = quote_m2! {
22        left + right 2
23    };
24    let source_file = parse_tokens(&quoted)?;
25    let _cell = &source_file.cells[0];
26
27    let mut collector = SymbolCollector::default();
28    collector.visit_source_file(&source_file);
29
30    println!("hierarchy: Expr -> PackedContent -> Cell -> SourceFile");
31    println!("visited: {}", collector.symbols.join(", "));
32    print!("generated: {}", source_file.to_m2());
33    Ok(())
34}