Skip to content

Commit 8c11c89

Browse files
committed
feat(ast): add visitors for statement variatns.
1 parent 75b6d57 commit 8c11c89

File tree

1 file changed

+71
-16
lines changed

1 file changed

+71
-16
lines changed

crates/fuse-ast/src/visit.rs

+71-16
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,32 @@ pub trait Visitor<'ast>: Sized {
3030
walk_statement(self, &statement)
3131
}
3232

33+
fn visit_variable_declaration(&mut self, decl: &'ast VariableDeclaration) {
34+
walk_variable_declaration(self, &decl)
35+
}
36+
37+
fn visit_function_declaration(&mut self, decl: &'ast Function) {
38+
walk_function(self, &decl)
39+
}
40+
41+
fn visit_enum_declaration(&mut self, decl: &'ast EnumDeclaration) {
42+
walk_enum_declaration(self, &decl)
43+
}
44+
45+
fn visit_enum_variant(&mut self, var: &'ast EnumVariant) {
46+
walk_enum_variant(self, &var)
47+
}
48+
49+
fn visit_struct_declaration(&mut self, decl: &'ast StructDeclaration) {
50+
walk_struct_declaration(self, &decl)
51+
}
52+
53+
fn visit_struct_field(&mut self, field: &'ast StructField) {
54+
walk_struct_field(self, &field)
55+
}
56+
57+
fn visit_visibility_modifier(&mut self, _: &'ast VisibilityModifier) {}
58+
3359
fn visit_expression(&mut self, expression: &'ast Expression) {
3460
walk_expression(self, &expression)
3561
}
@@ -87,7 +113,7 @@ pub trait Visitor<'ast>: Sized {
87113
}
88114

89115
fn visit_table_construction_expression(&mut self, expr: &'ast ConstructionExpression) {
90-
walk_table_construction_expression(self, expr)
116+
walk_construction_expression(self, expr)
91117
}
92118

93119
fn visit_struct_construction_expression(&mut self, expr: &'ast StructConstructionExpression) {
@@ -141,14 +167,24 @@ pub fn walk_block<'ast, V: Visitor<'ast>>(visitor: &mut V, block: &'ast Block) {
141167

142168
pub fn walk_statement<'ast, V: Visitor<'ast>>(visitor: &mut V, statement: &'ast Statement) {
143169
match statement {
144-
Statement::Empty(_) => {},
145-
Statement::Expression(expr) => visit!(visitor.visit_expression(expr)),
146-
_ => todo!()
147-
// Statement::VariableDeclaration(Box<VariableDeclaration>),
148-
// Statement::FunctionDeclaration(Box<Function>),
149-
// Statement::EnumDeclaration(Box<EnumDeclaration>),
150-
// Statement::StructDeclaration(Box<StructDeclaration>),
151-
// Statement::ImplStatement(Box<ImplStatement>),
170+
Statement::Empty(_) => {}
171+
Statement::Expression(expr) => visit!(visitor.visit_expression(expr)),
172+
Statement::VariableDeclaration(decl) => visit!(visitor.visit_variable_declaration(decl)),
173+
Statement::FunctionDeclaration(func) => visit!(visitor.visit_function_declaration(func)),
174+
Statement::EnumDeclaration(decl) => visit!(visitor.visit_enum_declaration(decl)),
175+
// Statement::StructDeclaration(Box<StructDeclaration>),
176+
// Statement::ImplStatement(Box<ImplStatement>),
177+
_ => todo!(),
178+
}
179+
}
180+
181+
pub fn walk_variable_declaration<'ast, V: Visitor<'ast>>(
182+
visitor: &mut V,
183+
decl: &'ast VariableDeclaration,
184+
) {
185+
visit!(visitor.visit_binding_pattern(&decl.binding));
186+
if let Some(decl) = &decl.expression {
187+
visit!(visitor.visit_expression(decl));
152188
}
153189
}
154190

@@ -221,6 +257,32 @@ pub fn walk_function_body<'ast, V: Visitor<'ast>>(visitor: &mut V, body: &'ast F
221257
}
222258
}
223259

260+
pub fn walk_enum_declaration<'ast, V: Visitor<'ast>>(visitor: &mut V, decl: &'ast EnumDeclaration) {
261+
visit!(visitor.visit_identifier(&decl.identifier));
262+
visit_list!(visitor.visit_enum_variant(&decl.variants));
263+
}
264+
265+
pub fn walk_enum_variant<'ast, V: Visitor<'ast>>(visitor: &mut V, var: &'ast EnumVariant) {
266+
visit!(visitor.visit_identifier(&var.identifier));
267+
if let Some(value) = &var.value {
268+
visit!(visitor.visit_expression(value));
269+
}
270+
}
271+
272+
pub fn walk_struct_declaration<'ast, V: Visitor<'ast>>(
273+
visitor: &mut V,
274+
decl: &'ast StructDeclaration,
275+
) {
276+
visit!(visitor.visit_identifier(&decl.identifier));
277+
visit_list!(visitor.visit_struct_field(&decl.fields));
278+
}
279+
280+
pub fn walk_struct_field<'ast, V: Visitor<'ast>>(visitor: &mut V, decl: &'ast StructField) {
281+
visit!(visitor.visit_visibility_modifier(&decl.modifier));
282+
visit!(visitor.visit_identifier(&decl.identifier));
283+
visit!(visitor.visit_type_annotation(&decl.type_annotation));
284+
}
285+
224286
pub fn walk_if<'ast, V: Visitor<'ast>>(visitor: &mut V, r#if: &'ast If) {
225287
visit!(visitor.visit_expression(&r#if.cond));
226288
visit!(visitor.visit_block(&r#if.body));
@@ -259,13 +321,6 @@ pub fn walk_parenthesized_expression<'ast, V: Visitor<'ast>>(
259321
visit!(visitor.visit_expression(&expr.expression))
260322
}
261323

262-
pub fn walk_table_construction_expression<'ast, V: Visitor<'ast>>(
263-
visitor: &mut V,
264-
expr: &'ast ConstructionExpression,
265-
) {
266-
visit!(visitor.visit_construction_expression(&expr));
267-
}
268-
269324
pub fn walk_struct_construction_expression<'ast, V: Visitor<'ast>>(
270325
visitor: &mut V,
271326
expr: &'ast StructConstructionExpression,

0 commit comments

Comments
 (0)