diff --git a/crates/core/src/ast/conditionals.rs b/crates/core/src/ast/conditionals.rs index 3dbebc58..34047a45 100644 --- a/crates/core/src/ast/conditionals.rs +++ b/crates/core/src/ast/conditionals.rs @@ -65,6 +65,7 @@ impl StatementTraversal for IfConditionalNode<'_> { if tp.traverse_else_body { self.else_body().map(|s| { s.accept(visitor, StatementTraversalContext::IfConditionalElseBody) }); } + visitor.exit_if_stmt(self, ctx); } } @@ -115,6 +116,7 @@ impl StatementTraversal for SwitchConditionalNode<'_> { if tp.traverse_body { self.body().accept(visitor, ()); } + visitor.exit_switch_stmt(self, ctx); } } diff --git a/crates/core/src/ast/functions.rs b/crates/core/src/ast/functions.rs index 85282599..1112ca1a 100644 --- a/crates/core/src/ast/functions.rs +++ b/crates/core/src/ast/functions.rs @@ -545,6 +545,7 @@ impl StatementTraversal for FunctionBlockNode<'_> { self.iter().for_each(|s| s.accept(visitor, iter_ctx)); } + visitor.exit_block_stmt(self, ctx); } } diff --git a/crates/core/src/ast/loops.rs b/crates/core/src/ast/loops.rs index 3ebccf70..a75d35e3 100644 --- a/crates/core/src/ast/loops.rs +++ b/crates/core/src/ast/loops.rs @@ -65,6 +65,7 @@ impl StatementTraversal for ForLoopNode<'_> { if tp.traverse_body { self.body().accept(visitor, StatementTraversalContext::ForLoopBody); } + visitor.exit_for_stmt(self, ctx); } } @@ -115,6 +116,7 @@ impl StatementTraversal for WhileLoopNode<'_> { if tp.traverse_body { self.body().accept(visitor, StatementTraversalContext::WhileLoopBody); } + visitor.exit_while_stmt(self, ctx); } } @@ -165,5 +167,6 @@ impl StatementTraversal for DoWhileLoopNode<'_> { if tp.traverse_body { self.body().accept(visitor, StatementTraversalContext::DoWhileLoopBody); } + visitor.exit_do_while_stmt(self, ctx); } } \ No newline at end of file diff --git a/crates/core/src/ast/traversal/visitor.rs b/crates/core/src/ast/traversal/visitor.rs index e2697811..093d0526 100644 --- a/crates/core/src/ast/traversal/visitor.rs +++ b/crates/core/src/ast/traversal/visitor.rs @@ -171,21 +171,25 @@ pub trait StatementVisitor { /// Called when visiting an expression statement inside a function. fn visit_expr_stmt(&mut self, n: &ExpressionStatementNode, ctx: StatementTraversalContext) {} - //TODO! add missing exit_ functions /// Called when visiting a `for` loop. fn visit_for_stmt(&mut self, n: &ForLoopNode, ctx: StatementTraversalContext) -> ForLoopTraversalPolicy { Default::default() } + fn exit_for_stmt(&mut self, n: &ForLoopNode, ctx: StatementTraversalContext) {} /// Called when visiting a `while` loop. fn visit_while_stmt(&mut self, n: &WhileLoopNode, ctx: StatementTraversalContext) -> WhileLoopTraversalPolicy { Default::default() } + fn exit_while_stmt(&mut self, n: &WhileLoopNode, ctx: StatementTraversalContext) {} /// Called when visiting a `do-while` loop. fn visit_do_while_stmt(&mut self, n: &DoWhileLoopNode, ctx: StatementTraversalContext) -> DoWhileLoopTraversalPolicy { Default::default() } + fn exit_do_while_stmt(&mut self, n: &DoWhileLoopNode, ctx: StatementTraversalContext) {} /// Called when visiting an `if` condition. fn visit_if_stmt(&mut self, n: &IfConditionalNode, ctx: StatementTraversalContext) -> IfConditionalTraversalPolicy { Default::default() } + fn exit_if_stmt(&mut self, n: &IfConditionalNode, ctx: StatementTraversalContext) {} /// Called when visiting a `switch` statement. fn visit_switch_stmt(&mut self, n: &SwitchConditionalNode, ctx: StatementTraversalContext) -> SwitchConditionalTraversalPolicy { Default::default() } + fn exit_switch_stmt(&mut self, n: &SwitchConditionalNode, ctx: StatementTraversalContext) {} /// Called when visiting a `case` label inside a `switch` statement. fn visit_switch_stmt_case(&mut self, n: &SwitchConditionalCaseLabelNode) {} @@ -207,6 +211,7 @@ pub trait StatementVisitor { /// Called when visiting a function block. This may mean a function definition or a scope inside that function. fn visit_block_stmt(&mut self, n: &FunctionBlockNode, ctx: FunctionBlockTraversalContext) -> FunctionBlockTraversalPolicy { Default::default() } + fn exit_block_stmt(&mut self, n: &FunctionBlockNode, ctx: FunctionBlockTraversalContext); /// Called when visiting a NOP statement. /// It most notably means: