aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/syntax_ptr.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-10-31 20:41:43 +0000
committerAleksey Kladov <[email protected]>2018-10-31 20:41:43 +0000
commit6be50f7d5de3737464853a589673375fc0cafa97 (patch)
tree2c6da7f3a1234c3f2fd3f330d2c9445953979598 /crates/ra_analysis/src/syntax_ptr.rs
parent857c1650efdb51650458f9ec1119adaa49b34371 (diff)
Reformat all
Diffstat (limited to 'crates/ra_analysis/src/syntax_ptr.rs')
-rw-r--r--crates/ra_analysis/src/syntax_ptr.rs23
1 files changed, 14 insertions, 9 deletions
diff --git a/crates/ra_analysis/src/syntax_ptr.rs b/crates/ra_analysis/src/syntax_ptr.rs
index c3c904633..612f75cd9 100644
--- a/crates/ra_analysis/src/syntax_ptr.rs
+++ b/crates/ra_analysis/src/syntax_ptr.rs
@@ -1,12 +1,12 @@
1use std::marker::PhantomData; 1use std::marker::PhantomData;
2 2
3use ra_syntax::{ 3use ra_syntax::{
4 File, TextRange, SyntaxKind, SyntaxNode, SyntaxNodeRef,
5 ast::{self, AstNode}, 4 ast::{self, AstNode},
5 File, SyntaxKind, SyntaxNode, SyntaxNodeRef, TextRange,
6}; 6};
7 7
8use crate::FileId;
9use crate::db::SyntaxDatabase; 8use crate::db::SyntaxDatabase;
9use crate::FileId;
10 10
11salsa::query_group! { 11salsa::query_group! {
12 pub(crate) trait SyntaxPtrDatabase: SyntaxDatabase { 12 pub(crate) trait SyntaxPtrDatabase: SyntaxDatabase {
@@ -52,12 +52,10 @@ trait ToAst {
52impl<'a> ToAst for &'a OwnedAst<ast::FnDef<'static>> { 52impl<'a> ToAst for &'a OwnedAst<ast::FnDef<'static>> {
53 type Ast = ast::FnDef<'a>; 53 type Ast = ast::FnDef<'a>;
54 fn to_ast(self) -> ast::FnDef<'a> { 54 fn to_ast(self) -> ast::FnDef<'a> {
55 ast::FnDef::cast(self.syntax.borrowed()) 55 ast::FnDef::cast(self.syntax.borrowed()).unwrap()
56 .unwrap()
57 } 56 }
58} 57}
59 58
60
61/// A pionter to a syntax node inside a file. 59/// A pionter to a syntax node inside a file.
62#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 60#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
63pub(crate) struct LocalSyntaxPtr { 61pub(crate) struct LocalSyntaxPtr {
@@ -79,22 +77,29 @@ impl LocalSyntaxPtr {
79 if curr.range() == self.range && curr.kind() == self.kind { 77 if curr.range() == self.range && curr.kind() == self.kind {
80 return curr.owned(); 78 return curr.owned();
81 } 79 }
82 curr = curr.children() 80 curr = curr
81 .children()
83 .find(|it| self.range.is_subrange(&it.range())) 82 .find(|it| self.range.is_subrange(&it.range()))
84 .unwrap_or_else(|| panic!("can't resolve local ptr to SyntaxNode: {:?}", self)) 83 .unwrap_or_else(|| panic!("can't resolve local ptr to SyntaxNode: {:?}", self))
85 } 84 }
86 } 85 }
87 86
88 pub(crate) fn into_global(self, file_id: FileId) -> SyntaxPtr { 87 pub(crate) fn into_global(self, file_id: FileId) -> SyntaxPtr {
89 SyntaxPtr { file_id, local: self} 88 SyntaxPtr {
89 file_id,
90 local: self,
91 }
90 } 92 }
91} 93}
92 94
93
94#[test] 95#[test]
95fn test_local_syntax_ptr() { 96fn test_local_syntax_ptr() {
96 let file = File::parse("struct Foo { f: u32, }"); 97 let file = File::parse("struct Foo { f: u32, }");
97 let field = file.syntax().descendants().find_map(ast::NamedFieldDef::cast).unwrap(); 98 let field = file
99 .syntax()
100 .descendants()
101 .find_map(ast::NamedFieldDef::cast)
102 .unwrap();
98 let ptr = LocalSyntaxPtr::new(field.syntax()); 103 let ptr = LocalSyntaxPtr::new(field.syntax());
99 let field_syntax = ptr.resolve(&file); 104 let field_syntax = ptr.resolve(&file);
100 assert_eq!(field.syntax(), field_syntax); 105 assert_eq!(field.syntax(), field_syntax);