diff options
Diffstat (limited to 'crates/ra_syntax/src/ptr.rs')
-rw-r--r-- | crates/ra_syntax/src/ptr.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/crates/ra_syntax/src/ptr.rs b/crates/ra_syntax/src/ptr.rs index 4823eb82e..016256075 100644 --- a/crates/ra_syntax/src/ptr.rs +++ b/crates/ra_syntax/src/ptr.rs | |||
@@ -1,6 +1,7 @@ | |||
1 | use crate::{AstNode, SyntaxKind, SyntaxNode, TextRange}; | ||
2 | use std::{iter::successors, marker::PhantomData}; | 1 | use std::{iter::successors, marker::PhantomData}; |
3 | 2 | ||
3 | use crate::{AstNode, SyntaxKind, SyntaxNode, TextRange}; | ||
4 | |||
4 | /// A pointer to a syntax node inside a file. It can be used to remember a | 5 | /// A pointer to a syntax node inside a file. It can be used to remember a |
5 | /// specific node across reparses of the same file. | 6 | /// specific node across reparses of the same file. |
6 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 7 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
@@ -14,9 +15,9 @@ impl SyntaxNodePtr { | |||
14 | SyntaxNodePtr { range: node.range(), kind: node.kind() } | 15 | SyntaxNodePtr { range: node.range(), kind: node.kind() } |
15 | } | 16 | } |
16 | 17 | ||
17 | pub fn to_node(self, root: &SyntaxNode) -> &SyntaxNode { | 18 | pub fn to_node(self, root: &SyntaxNode) -> SyntaxNode { |
18 | assert!(root.parent().is_none()); | 19 | assert!(root.parent().is_none()); |
19 | successors(Some(root), |&node| { | 20 | successors(Some(root.clone()), |node| { |
20 | node.children().find(|it| self.range.is_subrange(&it.range())) | 21 | node.children().find(|it| self.range.is_subrange(&it.range())) |
21 | }) | 22 | }) |
22 | .find(|it| it.range() == self.range && it.kind() == self.kind) | 23 | .find(|it| it.range() == self.range && it.kind() == self.kind) |
@@ -51,7 +52,7 @@ impl<N: AstNode> AstPtr<N> { | |||
51 | AstPtr { raw: SyntaxNodePtr::new(node.syntax()), _ty: PhantomData } | 52 | AstPtr { raw: SyntaxNodePtr::new(node.syntax()), _ty: PhantomData } |
52 | } | 53 | } |
53 | 54 | ||
54 | pub fn to_node(self, root: &SyntaxNode) -> &N { | 55 | pub fn to_node(self, root: &SyntaxNode) -> N { |
55 | let syntax_node = self.raw.to_node(root); | 56 | let syntax_node = self.raw.to_node(root); |
56 | N::cast(syntax_node).unwrap() | 57 | N::cast(syntax_node).unwrap() |
57 | } | 58 | } |
@@ -75,5 +76,5 @@ fn test_local_syntax_ptr() { | |||
75 | let field = file.syntax().descendants().find_map(ast::NamedFieldDef::cast).unwrap(); | 76 | let field = file.syntax().descendants().find_map(ast::NamedFieldDef::cast).unwrap(); |
76 | let ptr = SyntaxNodePtr::new(field.syntax()); | 77 | let ptr = SyntaxNodePtr::new(field.syntax()); |
77 | let field_syntax = ptr.to_node(file.syntax()); | 78 | let field_syntax = ptr.to_node(file.syntax()); |
78 | assert_eq!(field.syntax(), &*field_syntax); | 79 | assert_eq!(field.syntax(), &field_syntax); |
79 | } | 80 | } |