diff options
Diffstat (limited to 'crates/libsyntax2/src/algo/walk.rs')
-rw-r--r-- | crates/libsyntax2/src/algo/walk.rs | 10 |
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 | ||
19 | pub fn walk<'a>(root: SyntaxNodeRef<'a>) -> impl Iterator<Item = WalkEvent<'a>> { | 19 | pub 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 | }; |