Skip to content

Commit 28d5c9a

Browse files
committed
feat(ast): add trait for Visitor pattern.
1 parent ebca65f commit 28d5c9a

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

crates/fuse-ast/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
mod ast;
22
mod ast_factory;
33
mod precedence;
4+
mod visit;
45

56
pub use ast::*;
67
pub use ast_factory::*;

crates/fuse-ast/src/visit.rs

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// based on https://rust-unofficial.github.io/patterns/patterns/behavioural/visitor.html
2+
3+
use crate::ast::*;
4+
5+
macro_rules! visit_list {
6+
($visitor:ident, $method:ident, $list:expr) => {
7+
todo!()
8+
};
9+
}
10+
11+
pub trait Visitor<'ast>: Sized {
12+
fn visit_chunk(&mut self, chunk: &'ast Chunk) {
13+
walk_block(self, &chunk.body)
14+
}
15+
16+
fn visit_statement(&mut self, statement: &'ast Statement) {
17+
walk_statement(self, &statement)
18+
}
19+
}
20+
21+
pub fn walk_block<'ast, V: Visitor<'ast>>(visitor: &mut V, block: &'ast Block) {
22+
visit_list!(visitor, visit_statement, block.statements)
23+
}
24+
25+
pub fn walk_statement<'ast, V: Visitor<'ast>>(visitor: &mut V, statement: &'ast Statement) {
26+
todo!()
27+
}

0 commit comments

Comments
 (0)