diff --git a/.claude/commands/publish.md b/.claude/commands/publish.md deleted file mode 100644 index e48bd94..0000000 --- a/.claude/commands/publish.md +++ /dev/null @@ -1,3 +0,0 @@ -1. Commit all unstaged files -2. Squash commits which were not yet published on the remote. -3. Generate the final commit message based on the diff with the remote branch, from which the current branch is originated. diff --git a/.claude/commands/review.md b/.claude/commands/review.md deleted file mode 100644 index fd37aa2..0000000 --- a/.claude/commands/review.md +++ /dev/null @@ -1 +0,0 @@ -Review the code changes in the current branch, ensuring they adhere to the coding standards outlined in CLAUDE.md. diff --git a/crates/quickmark-core/src/tree_sitter_walker.rs b/crates/quickmark-core/src/tree_sitter_walker.rs index 3c0bd9c..e091a9a 100644 --- a/crates/quickmark-core/src/tree_sitter_walker.rs +++ b/crates/quickmark-core/src/tree_sitter_walker.rs @@ -25,25 +25,50 @@ impl<'a> TreeSitterWalker<'a> { } pub fn walk(&self, mut callback: impl FnMut(Node)) { - let root = self.tree.root_node(); + let mut cursor = self.tree.walk(); match self.order { - TraversalOrder::PreOrder => self.walk_pre_order(root, &mut callback), - TraversalOrder::PostOrder => self.walk_post_order(root, &mut callback), + TraversalOrder::PreOrder => self.walk_pre_order(&mut cursor, &mut callback), + TraversalOrder::PostOrder => self.walk_post_order(&mut cursor, &mut callback), } } #[allow(clippy::only_used_in_recursion)] - fn walk_pre_order(&self, node: Node, callback: &mut impl FnMut(Node)) { + fn walk_pre_order( + &self, + cursor: &mut tree_sitter::TreeCursor, + callback: &mut impl FnMut(Node), + ) { + let node = cursor.node(); callback(node); - for child in node.children(&mut node.walk()) { - self.walk_pre_order(child, callback); + + if cursor.goto_first_child() { + loop { + self.walk_pre_order(cursor, callback); + if !cursor.goto_next_sibling() { + break; + } + } + cursor.goto_parent(); } } + #[allow(clippy::only_used_in_recursion)] - fn walk_post_order(&self, node: Node, callback: &mut impl FnMut(Node)) { - for child in node.children(&mut node.walk()) { - self.walk_post_order(child, callback); + fn walk_post_order( + &self, + cursor: &mut tree_sitter::TreeCursor, + callback: &mut impl FnMut(Node), + ) { + if cursor.goto_first_child() { + loop { + self.walk_post_order(cursor, callback); + if !cursor.goto_next_sibling() { + break; + } + } + cursor.goto_parent(); } + + let node = cursor.node(); callback(node); } }