diff options
Diffstat (limited to 'crates/ra_analysis/src/syntax_ptr.rs')
-rw-r--r-- | crates/ra_analysis/src/syntax_ptr.rs | 23 |
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 @@ | |||
1 | use std::marker::PhantomData; | 1 | use std::marker::PhantomData; |
2 | 2 | ||
3 | use ra_syntax::{ | 3 | use 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 | ||
8 | use crate::FileId; | ||
9 | use crate::db::SyntaxDatabase; | 8 | use crate::db::SyntaxDatabase; |
9 | use crate::FileId; | ||
10 | 10 | ||
11 | salsa::query_group! { | 11 | salsa::query_group! { |
12 | pub(crate) trait SyntaxPtrDatabase: SyntaxDatabase { | 12 | pub(crate) trait SyntaxPtrDatabase: SyntaxDatabase { |
@@ -52,12 +52,10 @@ trait ToAst { | |||
52 | impl<'a> ToAst for &'a OwnedAst<ast::FnDef<'static>> { | 52 | impl<'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)] |
63 | pub(crate) struct LocalSyntaxPtr { | 61 | pub(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] |
95 | fn test_local_syntax_ptr() { | 96 | fn 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); |