aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/ptr.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-07-18 17:23:05 +0100
committerAleksey Kladov <[email protected]>2019-07-19 11:16:24 +0100
commitd402974aa0af6de290245a9d2a69a5d56c4fa610 (patch)
treedf4a0e38e548f9f74592e00a2c5a7d37bab3c4c2 /crates/ra_syntax/src/ptr.rs
parent58d4983ba5745975446d60f2886d96f8d2adf0f2 (diff)
migrate ra_syntax to the new rowan API
Diffstat (limited to 'crates/ra_syntax/src/ptr.rs')
-rw-r--r--crates/ra_syntax/src/ptr.rs11
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 @@
1use crate::{AstNode, SyntaxKind, SyntaxNode, TextRange};
2use std::{iter::successors, marker::PhantomData}; 1use std::{iter::successors, marker::PhantomData};
3 2
3use 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}