aboutsummaryrefslogtreecommitdiff
path: root/crates/libsyntax2/src/algo/walk.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/libsyntax2/src/algo/walk.rs')
-rw-r--r--crates/libsyntax2/src/algo/walk.rs10
1 files changed, 5 insertions, 5 deletions
diff --git a/crates/libsyntax2/src/algo/walk.rs b/crates/libsyntax2/src/algo/walk.rs
index d8797c453..536ee705f 100644
--- a/crates/libsyntax2/src/algo/walk.rs
+++ b/crates/libsyntax2/src/algo/walk.rs
@@ -17,19 +17,19 @@ pub enum WalkEvent<'a> {
17} 17}
18 18
19pub fn walk<'a>(root: SyntaxNodeRef<'a>) -> impl Iterator<Item = WalkEvent<'a>> { 19pub fn walk<'a>(root: SyntaxNodeRef<'a>) -> impl Iterator<Item = WalkEvent<'a>> {
20 generate(Some(WalkEvent::Enter(root)), |pos| { 20 generate(Some(WalkEvent::Enter(root)), move |pos| {
21 let next = match *pos { 21 let next = match *pos {
22 WalkEvent::Enter(node) => match node.first_child() { 22 WalkEvent::Enter(node) => match node.first_child() {
23 Some(child) => WalkEvent::Enter(child), 23 Some(child) => WalkEvent::Enter(child),
24 None => WalkEvent::Exit(node), 24 None => WalkEvent::Exit(node),
25 }, 25 },
26 WalkEvent::Exit(node) => { 26 WalkEvent::Exit(node) => {
27 if node == root {
28 return None;
29 }
27 match node.next_sibling() { 30 match node.next_sibling() {
28 Some(sibling) => WalkEvent::Enter(sibling), 31 Some(sibling) => WalkEvent::Enter(sibling),
29 None => match node.parent() { 32 None => WalkEvent::Exit(node.parent().unwrap()),
30 Some(node) => WalkEvent::Exit(node),
31 None => return None,
32 },
33 } 33 }
34 } 34 }
35 }; 35 };