Skip to content

Commit 3d1bf42

Browse files
committed
feat(ast,visitor): implement AstNode and it's visitors.
1 parent 7dd03cb commit 3d1bf42

File tree

2 files changed

+72
-18
lines changed

2 files changed

+72
-18
lines changed

crates/fuse-ast/src/ast_node.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ pub enum AstNode<'a> {
1616

1717
// expression related
1818
FunctionExpression(&'a Function),
19+
CallExpression(&'a CallExpression),
1920
ArrayExpression(&'a ArrayExpression),
2021
ParenthesizedExpression(&'a ParenthesizedExpression),
2122
ConstructionExpression(&'a ConstructionExpression),
23+
TableConstructionExpression(&'a ConstructionExpression),
2224
StructConstructionExpression(&'a StructConstructionExpression),
2325
If(&'a If),
2426
Else(&'a Else),
@@ -29,9 +31,11 @@ pub enum AstNode<'a> {
2931
FunctionParameter(&'a FunctionParameter),
3032
FunctionBody(&'a FunctionBody),
3133

34+
// Misc
3235
EnumVariant(&'a EnumVariant),
33-
3436
StructField(&'a StructField),
37+
ConstructionField(&'a ConstructionField),
38+
ArrayExpressionElement(&'a ArrayExpressionElement),
3539

3640
VisibilityModifier(&'a VisibilityModifier),
3741

@@ -41,7 +45,18 @@ pub enum AstNode<'a> {
4145
BooleanLiteral(&'a BooleanLiteral),
4246

4347
Identifier(&'a Identifier),
48+
BindingPattern(&'a BindingPattern),
49+
BindingIdentifier(&'a BindingIdentifier),
50+
BindingRest(&'a BindingRest),
51+
KeyValueArgument(&'a KeyValueArgument),
52+
SpreadArgument(&'a SpreadArgument),
4453

4554
UnaryOperator(&'a UnaryOperator),
4655
BinaryOperator(&'a BinaryOperator),
56+
57+
MemberExpression(&'a MemberExpression),
58+
MemberExpressionLHS(&'a MemberExpressionLHS),
59+
MemberExpressionRHS(&'a MemberExpressionRHS),
60+
61+
TypeAnnotation(&'a TypeAnnotation),
4762
}

crates/fuse-visitor/src/visitor.rs

+56-17
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ pub trait Visitor<'ast>: ScopeVisitor + NodeVisitor + Sized {
193193
}
194194

195195
fn visit_table_construction_expression(&mut self, expr: &'ast ConstructionExpression) {
196-
let node = AstNode::ConstructionExpression(expr);
196+
let node = AstNode::TableConstructionExpression(expr);
197197
self.enter_node(node);
198198
walk_construction_expression(self, expr);
199199
self.leave_node(node);
@@ -207,55 +207,94 @@ pub trait Visitor<'ast>: ScopeVisitor + NodeVisitor + Sized {
207207
}
208208

209209
fn visit_member_expression(&mut self, expr: &'ast MemberExpression) {
210-
walk_member_expression(self, expr)
210+
let node = AstNode::MemberExpression(expr);
211+
self.enter_node(node);
212+
walk_member_expression(self, expr);
213+
self.leave_node(node);
211214
}
212215

213216
fn visit_member_expression_lhs(&mut self, lhs: &'ast MemberExpressionLHS) {
214-
walk_member_expression_lhs(self, lhs)
217+
let node = AstNode::MemberExpressionLHS(lhs);
218+
self.enter_node(node);
219+
walk_member_expression_lhs(self, lhs);
220+
self.leave_node(node);
215221
}
216222

217223
fn visit_member_expression_rhs(&mut self, rhs: &'ast MemberExpressionRHS) {
218-
walk_member_expression_rhs(self, rhs)
224+
let node = AstNode::MemberExpressionRHS(rhs);
225+
self.enter_node(node);
226+
walk_member_expression_rhs(self, rhs);
227+
self.leave_node(node);
219228
}
220229

221230
fn visit_construction_expression(&mut self, expr: &'ast ConstructionExpression) {
222-
walk_construction_expression(self, expr)
231+
let node = AstNode::ConstructionExpression(expr);
232+
self.enter_node(node);
233+
walk_construction_expression(self, expr);
234+
self.leave_node(node);
223235
}
224236

225237
fn visit_construction_field(&mut self, field: &'ast ConstructionField) {
226-
walk_construction_field(self, field)
238+
let node = AstNode::ConstructionField(field);
239+
self.enter_node(node);
240+
walk_construction_field(self, field);
241+
self.leave_node(node);
227242
}
228243

229244
fn visit_call_expression(&mut self, call: &'ast CallExpression) {
230-
walk_call_expression(self, call)
245+
let node = AstNode::CallExpression(call);
246+
self.enter_node(node);
247+
walk_call_expression(self, call);
248+
self.leave_node(node);
231249
}
232250

233251
fn visit_array_expression_element(&mut self, element: &'ast ArrayExpressionElement) {
234-
walk_array_expression_element(self, element)
252+
let node = AstNode::ArrayExpressionElement(element);
253+
self.enter_node(node);
254+
walk_array_expression_element(self, element);
255+
self.leave_node(node);
235256
}
236257

237258
fn visit_binding_pattern(&mut self, pattern: &'ast BindingPattern) {
238-
walk_binding_pattern(self, pattern)
259+
let node = AstNode::BindingPattern(pattern);
260+
self.enter_node(node);
261+
walk_binding_pattern(self, pattern);
262+
self.leave_node(node);
239263
}
240264

241-
fn visit_binding_identifier(&mut self, pattern: &'ast BindingIdentifier) {
242-
walk_binding_identifier(self, pattern)
265+
fn visit_binding_identifier(&mut self, binding: &'ast BindingIdentifier) {
266+
let node = AstNode::BindingIdentifier(binding);
267+
self.enter_node(node);
268+
walk_binding_identifier(self, binding);
269+
self.leave_node(node);
243270
}
244271

245272
fn visit_binding_rest(&mut self, arg: &'ast BindingRest) {
246-
walk_binding_rest(self, arg)
273+
let node = AstNode::BindingRest(arg);
274+
self.enter_node(node);
275+
walk_binding_rest(self, arg);
276+
self.leave_node(node);
247277
}
248278

249279
fn visit_key_value_argument(&mut self, arg: &'ast KeyValueArgument) {
250-
walk_key_value_argument(self, arg)
280+
let node = AstNode::KeyValueArgument(arg);
281+
self.enter_node(node);
282+
walk_key_value_argument(self, arg);
283+
self.leave_node(node);
251284
}
252285

253286
fn visit_spread_argument(&mut self, arg: &'ast SpreadArgument) {
254-
walk_spread_argument(self, arg)
287+
let node = AstNode::SpreadArgument(arg);
288+
self.enter_node(node);
289+
walk_spread_argument(self, arg);
290+
self.leave_node(node);
255291
}
256292

257293
fn visit_type_annotation(&mut self, annotation: &'ast TypeAnnotation) {
258-
walk_type_annotation(self, annotation)
294+
let node = AstNode::TypeAnnotation(annotation);
295+
self.enter_node(node);
296+
walk_type_annotation(self, annotation);
297+
self.leave_node(node);
259298
}
260299
}
261300

@@ -513,9 +552,9 @@ pub fn walk_binding_pattern<'ast, V: Visitor<'ast>>(
513552

514553
pub fn walk_binding_identifier<'ast, V: Visitor<'ast>>(
515554
visitor: &mut V,
516-
pattern: &'ast BindingIdentifier,
555+
binding: &'ast BindingIdentifier,
517556
) {
518-
visit!(visitor.visit_identifier(&pattern.identifier))
557+
visit!(visitor.visit_identifier(&binding.identifier))
519558
}
520559

521560
pub fn walk_binding_rest<'ast, V: Visitor<'ast>>(visitor: &mut V, rest: &'ast BindingRest) {

0 commit comments

Comments
 (0)