Skip to content

Commit

Permalink
fix: added missing traversal contexts
Browse files Browse the repository at this point in the history
  • Loading branch information
SpontanCombust committed Aug 29, 2024
1 parent 98f8d60 commit 1de643a
Show file tree
Hide file tree
Showing 9 changed files with 176 additions and 33 deletions.
24 changes: 16 additions & 8 deletions crates/core/src/ast/conditionals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ impl SyntaxNodeTraversal for IfConditionalNode<'_> {
let tp = visitor.visit_if_stmt(self, ctx);

if tp.any() {
ctx.push(TraversalContext::IfConditional);

for ch in self.children_detailed() {
match ch {
Ok((cond, Some("cond"))) if tp.traverse_cond => {
Expand Down Expand Up @@ -92,6 +94,8 @@ impl SyntaxNodeTraversal for IfConditionalNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_if_stmt(self, ctx);
Expand Down Expand Up @@ -142,6 +146,8 @@ impl SyntaxNodeTraversal for SwitchConditionalNode<'_> {
let tp = visitor.visit_switch_stmt(self, ctx);

if tp.any() {
ctx.push(TraversalContext::SwitchConditional);

for ch in self.children_detailed() {
match ch {
Ok((cond, Some("cond"))) if tp.traverse_cond => {
Expand All @@ -153,12 +159,8 @@ impl SyntaxNodeTraversal for SwitchConditionalNode<'_> {
ctx.pop();
},
Ok((body, Some("body"))) if tp.traverse_body => {
ctx.push(TraversalContext::SwitchConditionalBody);

let body: SwitchConditionalBlockNode = body.unsafe_into();
body.accept_with_policy(visitor, ctx, tp.clone());

ctx.pop();
},
Ok((unnamed, _)) if !unnamed.is_named() && tp.traverse_unnamed => {
let unnamed: UnnamedNode = unnamed.unsafe_into();
Expand All @@ -170,6 +172,8 @@ impl SyntaxNodeTraversal for SwitchConditionalNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_switch_stmt(self, ctx);
Expand Down Expand Up @@ -350,15 +354,13 @@ impl SyntaxNodeTraversal for SwitchConditionalCaseLabelNode<'_> {
let tp = visitor.visit_switch_stmt_case(self, ctx);

if tp.any() {
ctx.push(TraversalContext::SwitchConditionalCaseLabel);

for ch in self.children_detailed() {
match ch {
Ok((value, Some("value"))) if tp.traverse_value => {
ctx.push(TraversalContext::SwitchConditionalCaseLabel);

let value: ExpressionNode = value.unsafe_into();
value.accept(visitor, ctx);

ctx.pop();
},
Ok((unnamed, _)) if !unnamed.is_named() && tp.traverse_unnamed => {
let unnamed: UnnamedNode = unnamed.unsafe_into();
Expand All @@ -370,6 +372,8 @@ impl SyntaxNodeTraversal for SwitchConditionalCaseLabelNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_switch_stmt_case(self, ctx);
Expand Down Expand Up @@ -407,6 +411,8 @@ impl SyntaxNodeTraversal for SwitchConditionalDefaultLabelNode<'_> {
let tp = visitor.visit_switch_stmt_default(self, ctx);

if tp.any() {
ctx.push(TraversalContext::SwitchConditionalDefaultLabel);

for ch in self.children_detailed() {
match ch {
Ok((unnamed, _)) if !unnamed.is_named() && tp.traverse_unnamed => {
Expand All @@ -419,6 +425,8 @@ impl SyntaxNodeTraversal for SwitchConditionalDefaultLabelNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_switch_stmt_default(self, ctx);
Expand Down
14 changes: 9 additions & 5 deletions crates/core/src/ast/enums.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,13 @@ impl SyntaxNodeTraversal for EnumDeclarationNode<'_> {
let tp = visitor.visit_enum_decl(self);

if tp.any() {
ctx.push(TraversalContext::Enum);

for ch in self.children_detailed() {
match ch {
Ok((def, Some("definition"))) if tp.traverse_definition => {
ctx.push(TraversalContext::Enum);

Ok((def, Some("definition"))) if tp.traverse_definition => {
let def: EnumBlockNode = def.unsafe_into();
def.accept_with_policy(visitor, ctx, tp.clone());

ctx.pop();
},
Ok((unnamed, _)) if !unnamed.is_named() && tp.traverse_unnamed => {
let unnamed: UnnamedNode = unnamed.unsafe_into();
Expand All @@ -72,6 +70,8 @@ impl SyntaxNodeTraversal for EnumDeclarationNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_enum_decl(self);
Expand Down Expand Up @@ -190,6 +190,8 @@ impl SyntaxNodeTraversal for EnumVariantDeclarationNode<'_> {
let tp = visitor.visit_enum_variant_decl(self);

if tp.any() {
ctx.push(TraversalContext::EnumVariant);

for ch in self.children_detailed() {
match ch {
Ok((unnamed, _)) if !unnamed.is_named() && tp.traverse_unnamed => {
Expand All @@ -202,6 +204,8 @@ impl SyntaxNodeTraversal for EnumVariantDeclarationNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_enum_variant_decl(self);
Expand Down
57 changes: 49 additions & 8 deletions crates/core/src/ast/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ impl SyntaxNodeTraversal for NestedExpressionNode<'_> {
let tp = visitor.visit_nested_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::NestedExpression);

for ch in self.children_detailed() {
match ch {
Ok((inner, _)) if inner.is_named() && tp.traverse_inner => {
Expand All @@ -81,7 +83,9 @@ impl SyntaxNodeTraversal for NestedExpressionNode<'_> {
},
_ => {}
}
}
}

ctx.pop();
}

visitor.exit_nested_expr(self, ctx);
Expand Down Expand Up @@ -268,6 +272,8 @@ impl SyntaxNodeTraversal for FunctionCallExpressionNode<'_> {
let tp = visitor.visit_func_call_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::FunctionCall);

for ch in self.children_detailed() {
match ch {
Ok((func, Some("func"))) if tp.traverse_func => {
Expand All @@ -293,6 +299,8 @@ impl SyntaxNodeTraversal for FunctionCallExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_func_call_expr(self, ctx);
Expand Down Expand Up @@ -348,6 +356,7 @@ impl<'script> FunctionCallArgumentsNode<'script> {
}

fn accept_with_policy<V: SyntaxNodeVisitor>(&self, visitor: &mut V, ctx: &mut TraversalContextStack, tp: FunctionCallExpressionTraversalPolicy) {
//FIXME missing unnamed traversal
for res in self.iter_result() {
match res {
Ok(arg) => {
Expand Down Expand Up @@ -487,6 +496,8 @@ impl SyntaxNodeTraversal for ArrayExpressionNode<'_> {
let tp = visitor.visit_array_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::ArrayExpression);

for ch in self.children_detailed() {
match ch {
Ok((accessor, Some("accessor"))) if tp.traverse_accessor => {
Expand All @@ -513,6 +524,8 @@ impl SyntaxNodeTraversal for ArrayExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_array_expr(self, ctx);
Expand Down Expand Up @@ -563,6 +576,8 @@ impl SyntaxNodeTraversal for MemberAccessExpressionNode<'_> {
let tp = visitor.visit_member_access_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::MemberAccessExpression);

for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((accessor, Some("accessor"))) if tp.traverse_accessor => {
Expand All @@ -579,6 +594,8 @@ impl SyntaxNodeTraversal for MemberAccessExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_member_access_expr(self, ctx);
Expand Down Expand Up @@ -629,6 +646,8 @@ impl SyntaxNodeTraversal for NewExpressionNode<'_> {
let tp = visitor.visit_new_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::NewExpression);

for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((lifetime_obj, Some("lifetime_obj"))) if tp.traverse_lifetime_obj => {
Expand All @@ -644,6 +663,8 @@ impl SyntaxNodeTraversal for NewExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_new_expr(self, ctx);
Expand Down Expand Up @@ -694,6 +715,8 @@ impl SyntaxNodeTraversal for TypeCastExpressionNode<'_> {
let tp = visitor.visit_type_cast_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::TypeCastExpression);

for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((value, Some("value"))) if tp.traverse_value => {
Expand All @@ -709,6 +732,8 @@ impl SyntaxNodeTraversal for TypeCastExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_type_cast_expr(self, ctx);
Expand Down Expand Up @@ -759,6 +784,8 @@ impl SyntaxNodeTraversal for UnaryOperationExpressionNode<'_> {
let tp = visitor.visit_unary_op_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::UnaryOperationExpression);

for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((right, Some("right"))) if tp.traverse_right => {
Expand All @@ -774,6 +801,8 @@ impl SyntaxNodeTraversal for UnaryOperationExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_unary_op_expr(self, ctx);
Expand Down Expand Up @@ -829,6 +858,8 @@ impl SyntaxNodeTraversal for BinaryOperationExpressionNode<'_> {
let tp = visitor.visit_binary_op_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::BinaryOperationExpression);

for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((left, Some("left"))) if tp.traverse_left => {
Expand All @@ -851,6 +882,8 @@ impl SyntaxNodeTraversal for BinaryOperationExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_binary_op_expr(self, ctx);
Expand Down Expand Up @@ -906,6 +939,8 @@ impl SyntaxNodeTraversal for AssignmentOperationExpressionNode<'_> {
let tp = visitor.visit_assign_op_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::AssignmentOperationExpression);

for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((left, Some("left"))) if tp.traverse_left => {
Expand All @@ -928,6 +963,8 @@ impl SyntaxNodeTraversal for AssignmentOperationExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_assign_op_expr(self, ctx);
Expand Down Expand Up @@ -983,6 +1020,8 @@ impl SyntaxNodeTraversal for TernaryConditionalExpressionNode<'_> {
let tp = visitor.visit_ternary_cond_expr(self, ctx);

if tp.any() {
ctx.push(TraversalContext::TernaryConditionalExpression);

for ch in self.children_detailed() {
match ch {
Ok((cond, Some("cond"))) if tp.traverse_cond => {
Expand Down Expand Up @@ -1016,6 +1055,8 @@ impl SyntaxNodeTraversal for TernaryConditionalExpressionNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_ternary_cond_expr(self, ctx);
Expand Down Expand Up @@ -1187,10 +1228,10 @@ impl<'script> TryFrom<AnyNode<'script>> for ExpressionNode<'script> {
AssignmentOperationExpressionNode::NODE_KIND |
TernaryConditionalExpressionNode::NODE_KIND |
BinaryOperationExpressionNode::NODE_KIND |
NewExpressionNode::NODE_KIND |
NewExpressionNode::NODE_KIND |
UnaryOperationExpressionNode::NODE_KIND |
TypeCastExpressionNode::NODE_KIND |
MemberAccessExpressionNode::NODE_KIND |
MemberAccessExpressionNode::NODE_KIND |
FunctionCallExpressionNode::NODE_KIND |
ArrayExpressionNode::NODE_KIND |
NestedExpressionNode::NODE_KIND |
Expand Down Expand Up @@ -1377,15 +1418,13 @@ impl SyntaxNodeTraversal for ExpressionStatementNode<'_> {
let tp = visitor.visit_expr_stmt(self, ctx);

if tp.any() {
ctx.push(TraversalContext::ExpressionStatement);

for ch in self.children_detailed() {
match ch {
Ok((expr, _)) if expr.is_named() && tp.traverse_expr => {
ctx.push(TraversalContext::ExpressionStatement);

let expr: ExpressionNode = expr.unsafe_into();
expr.accept(visitor, ctx);

ctx.pop();
expr.accept(visitor, ctx);
},
Ok((unnamed, _)) if !unnamed.is_named() && tp.traverse_unnamed => {
let unnamed: UnnamedNode = unnamed.unsafe_into();
Expand All @@ -1397,6 +1436,8 @@ impl SyntaxNodeTraversal for ExpressionStatementNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_expr_stmt(self, ctx);
Expand Down
Loading

0 comments on commit 1de643a

Please sign in to comment.