Skip to content

Commit 75b6d57

Browse files
committed
feat(ast): support visitor support for expression types.
1 parent c971494 commit 75b6d57

File tree

1 file changed

+179
-20
lines changed

1 file changed

+179
-20
lines changed

crates/fuse-ast/src/visit.rs

+179-20
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ macro_rules! visit {
1010
}
1111

1212
macro_rules! visit_list {
13-
($visitor:ident, $method:ident, $list:expr $(, $($extra_args:expr), *)?) => {
13+
($visitor:ident.$method:ident($list:expr $(, $($extra_args:expr), *)?)) => {
1414
for elem in $list {
1515
visit!($visitor.$method(elem $(, $($extra_args),*)?))
1616
}
@@ -62,6 +62,54 @@ pub trait Visitor<'ast>: Sized {
6262
walk_function_body(self, &body)
6363
}
6464

65+
fn visit_if(&mut self, r#if: &'ast If) {
66+
walk_if(self, &r#if)
67+
}
68+
69+
fn visit_else(&mut self, r#else: &'ast Else) {
70+
walk_else(self, &r#else)
71+
}
72+
73+
fn visit_unary_operator(&mut self, op: &'ast UnaryOperator) {
74+
walk_unary_operator(self, op)
75+
}
76+
77+
fn visit_binary_operator(&mut self, op: &'ast BinaryOperator) {
78+
walk_binary_operator(self, op)
79+
}
80+
81+
fn visit_array_expression(&mut self, array: &'ast ArrayExpression) {
82+
walk_array_expression(self, array)
83+
}
84+
85+
fn visit_parenthesized_expression(&mut self, expr: &'ast ParenthesizedExpression) {
86+
walk_parenthesized_expression(self, expr)
87+
}
88+
89+
fn visit_table_construction_expression(&mut self, expr: &'ast ConstructionExpression) {
90+
walk_table_construction_expression(self, expr)
91+
}
92+
93+
fn visit_struct_construction_expression(&mut self, expr: &'ast StructConstructionExpression) {
94+
walk_struct_construction_expression(self, expr)
95+
}
96+
97+
fn visit_construction_expression(&mut self, expr: &'ast ConstructionExpression) {
98+
walk_construction_expression(self, expr)
99+
}
100+
101+
fn visit_construction_field(&mut self, field: &'ast ConstructionField) {
102+
walk_construction_field(self, field)
103+
}
104+
105+
fn visit_call_expression(&mut self, call: &'ast CallExpression) {
106+
walk_call_expression(self, call)
107+
}
108+
109+
fn visit_array_expression_element(&mut self, element: &'ast ArrayExpressionElement) {
110+
walk_array_expression_element(self, element)
111+
}
112+
65113
fn visit_binding_pattern(&mut self, pattern: &'ast BindingPattern) {
66114
walk_binding_pattern(self, &pattern)
67115
}
@@ -70,8 +118,16 @@ pub trait Visitor<'ast>: Sized {
70118
walk_binding_identifier(self, &pattern)
71119
}
72120

73-
fn visit_binding_rest(&mut self, rest: &'ast BindingRest) {
74-
walk_binding_rest(self, &rest)
121+
fn visit_binding_rest(&mut self, arg: &'ast BindingRest) {
122+
walk_binding_rest(self, &arg)
123+
}
124+
125+
fn visit_key_value_argument(&mut self, arg: &'ast KeyValueArgument) {
126+
walk_key_value_argument(self, &arg)
127+
}
128+
129+
fn visit_spread_argument(&mut self, arg: &'ast SpreadArgument) {
130+
walk_spread_argument(self, &arg)
75131
}
76132

77133
fn visit_type_annotation(&mut self, annotation: &'ast TypeAnnotation) {
@@ -80,7 +136,7 @@ pub trait Visitor<'ast>: Sized {
80136
}
81137

82138
pub fn walk_block<'ast, V: Visitor<'ast>>(visitor: &mut V, block: &'ast Block) {
83-
visit_list!(visitor, visit_statement, &block.statements)
139+
visit_list!(visitor.visit_statement(&block.statements))
84140
}
85141

86142
pub fn walk_statement<'ast, V: Visitor<'ast>>(visitor: &mut V, statement: &'ast Statement) {
@@ -98,22 +154,26 @@ pub fn walk_statement<'ast, V: Visitor<'ast>>(visitor: &mut V, statement: &'ast
98154

99155
pub fn walk_expression<'ast, V: Visitor<'ast>>(visitor: &mut V, expression: &'ast Expression) {
100156
match expression {
101-
Expression::NumberLiteral(lit) => visit!(visitor.visit_number_literal(lit)),
102-
Expression::StringLiteral(lit) => visit!(visitor.visit_string_literal(lit)),
103-
Expression::BooleanLiteral(lit) => visit!(visitor.visit_boolean_literal(lit)),
104-
Expression::Identifier(ident) => visit!(visitor.visit_identifier(ident)),
105-
Expression::Function(func) => visit!(visitor.visit_function(func)),
106-
107-
// Expression::If(e),
108-
// Expression::UnaryOperator(e),
109-
// Expression::BinaryOperator(e),
110-
// Expression::ArrayExpression(e),
111-
// Expression::TupleExpression(e),
112-
// Expression::ParenthesizedExpression(e),
113-
// Expression::CallExpression(e),
114-
// Expression::TableConstructionExpression(e),
115-
// Expression::StructConstructionExpression(e),
116-
_ => todo!(),
157+
Expression::NumberLiteral(expr) => visit!(visitor.visit_number_literal(expr)),
158+
Expression::StringLiteral(expr) => visit!(visitor.visit_string_literal(expr)),
159+
Expression::BooleanLiteral(expr) => visit!(visitor.visit_boolean_literal(expr)),
160+
Expression::Identifier(expr) => visit!(visitor.visit_identifier(expr)),
161+
Expression::Function(expr) => visit!(visitor.visit_function(expr)),
162+
Expression::If(expr) => visit!(visitor.visit_if(expr)),
163+
Expression::UnaryOperator(expr) => visit!(visitor.visit_unary_operator(expr)),
164+
Expression::BinaryOperator(expr) => visit!(visitor.visit_binary_operator(expr)),
165+
Expression::ArrayExpression(expr) => visit!(visitor.visit_array_expression(expr)),
166+
Expression::TupleExpression(..) => todo!(),
167+
Expression::ParenthesizedExpression(expr) => {
168+
visit!(visitor.visit_parenthesized_expression(expr))
169+
}
170+
Expression::CallExpression(expr) => visit!(visitor.visit_call_expression(expr)),
171+
Expression::TableConstructionExpression(expr) => {
172+
visit!(visitor.visit_table_construction_expression(expr))
173+
}
174+
Expression::StructConstructionExpression(expr) => {
175+
visit!(visitor.visit_struct_construction_expression(expr))
176+
}
117177
}
118178
}
119179

@@ -161,6 +221,92 @@ pub fn walk_function_body<'ast, V: Visitor<'ast>>(visitor: &mut V, body: &'ast F
161221
}
162222
}
163223

224+
pub fn walk_if<'ast, V: Visitor<'ast>>(visitor: &mut V, r#if: &'ast If) {
225+
visit!(visitor.visit_expression(&r#if.cond));
226+
visit!(visitor.visit_block(&r#if.body));
227+
if let Some(r#else) = &r#if.r#else {
228+
visit!(visitor.visit_else(r#else));
229+
}
230+
}
231+
232+
pub fn walk_else<'ast, V: Visitor<'ast>>(visitor: &mut V, r#else: &'ast Else) {
233+
match r#else {
234+
Else::If(r#if) => visit!(visitor.visit_if(r#if)),
235+
Else::Block(block) => visit!(visitor.visit_block(block)),
236+
}
237+
}
238+
239+
pub fn walk_unary_operator<'ast, V: Visitor<'ast>>(visitor: &mut V, op: &'ast UnaryOperator) {
240+
visit!(visitor.visit_expression(&op.expression))
241+
}
242+
243+
pub fn walk_binary_operator<'ast, V: Visitor<'ast>>(visitor: &mut V, op: &'ast BinaryOperator) {
244+
visit!(visitor.visit_expression(&op.lhs));
245+
visit!(visitor.visit_expression(&op.rhs));
246+
}
247+
248+
pub fn walk_array_expression<'ast, V: Visitor<'ast>>(
249+
visitor: &mut V,
250+
array: &'ast ArrayExpression,
251+
) {
252+
visit_list!(visitor.visit_array_expression_element(&array.elements))
253+
}
254+
255+
pub fn walk_parenthesized_expression<'ast, V: Visitor<'ast>>(
256+
visitor: &mut V,
257+
expr: &'ast ParenthesizedExpression,
258+
) {
259+
visit!(visitor.visit_expression(&expr.expression))
260+
}
261+
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+
269+
pub fn walk_struct_construction_expression<'ast, V: Visitor<'ast>>(
270+
visitor: &mut V,
271+
expr: &'ast StructConstructionExpression,
272+
) {
273+
visit!(visitor.visit_expression(&expr.target));
274+
visit!(visitor.visit_construction_expression(&expr.construction));
275+
}
276+
277+
pub fn walk_construction_expression<'ast, V: Visitor<'ast>>(
278+
visitor: &mut V,
279+
expr: &'ast ConstructionExpression,
280+
) {
281+
visit_list!(visitor.visit_construction_field(&expr.fields))
282+
}
283+
284+
pub fn walk_construction_field<'ast, V: Visitor<'ast>>(
285+
visitor: &mut V,
286+
field: &'ast ConstructionField,
287+
) {
288+
match field {
289+
ConstructionField::Expression(expr) => visit!(visitor.visit_expression(expr)),
290+
ConstructionField::KeyValueArgument(kv) => visit!(visitor.visit_key_value_argument(kv)),
291+
ConstructionField::Spread(spread) => visit!(visitor.visit_spread_argument(spread)),
292+
}
293+
}
294+
295+
pub fn walk_call_expression<'ast, V: Visitor<'ast>>(visitor: &mut V, call: &'ast CallExpression) {
296+
visit!(visitor.visit_expression(&call.target));
297+
visit_list!(visitor.visit_expression(&call.arguments));
298+
}
299+
300+
pub fn walk_array_expression_element<'ast, V: Visitor<'ast>>(
301+
visitor: &mut V,
302+
element: &'ast ArrayExpressionElement,
303+
) {
304+
match element {
305+
ArrayExpressionElement::Expression(expr) => visit!(visitor.visit_expression(expr)),
306+
ArrayExpressionElement::Spread(spread) => visit!(visitor.visit_spread_argument(spread)),
307+
}
308+
}
309+
164310
pub fn walk_binding_pattern<'ast, V: Visitor<'ast>>(
165311
visitor: &mut V,
166312
pattern: &'ast BindingPattern,
@@ -187,10 +333,23 @@ pub fn walk_binding_rest<'ast, V: Visitor<'ast>>(visitor: &mut V, rest: &'ast Bi
187333
};
188334
}
189335

336+
pub fn walk_key_value_argument<'ast, V: Visitor<'ast>>(
337+
visitor: &mut V,
338+
kv: &'ast KeyValueArgument,
339+
) {
340+
visit!(visitor.visit_identifier(&kv.key));
341+
visit!(visitor.visit_expression(&kv.value));
342+
}
343+
344+
pub fn walk_spread_argument<'ast, V: Visitor<'ast>>(visitor: &mut V, spread: &'ast SpreadArgument) {
345+
visit!(visitor.visit_expression(&spread.element));
346+
}
347+
190348
pub fn walk_type_annotation<'ast, V: Visitor<'ast>>(
191349
visitor: &mut V,
192350
annotation: &'ast TypeAnnotation,
193351
) {
352+
println!("not implemented.")
194353
}
195354

196355
pub fn walk_template<'ast, V: Visitor<'ast>>(visitor: &mut V, expression: &'ast Expression) {}

0 commit comments

Comments
 (0)