diff options
author | Ekaterina Babshukova <[email protected]> | 2019-10-10 16:51:51 +0100 |
---|---|---|
committer | Ekaterina Babshukova <[email protected]> | 2019-10-22 21:47:31 +0100 |
commit | 5b03773fbeea55d86f64e5fb69a0d0f1d6a4f7e8 (patch) | |
tree | 1f3ce5c71343535ae0ca0751982a1d0f89480e45 /crates/ra_ide_api/src/references.rs | |
parent | 01853e8d6c6f4b44801c74f4fcdef735d9e77b48 (diff) |
implement search of references
Diffstat (limited to 'crates/ra_ide_api/src/references.rs')
-rw-r--r-- | crates/ra_ide_api/src/references.rs | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/crates/ra_ide_api/src/references.rs b/crates/ra_ide_api/src/references.rs index 24453452b..24cd7e827 100644 --- a/crates/ra_ide_api/src/references.rs +++ b/crates/ra_ide_api/src/references.rs | |||
@@ -7,10 +7,8 @@ use relative_path::{RelativePath, RelativePathBuf}; | |||
7 | 7 | ||
8 | use crate::{ | 8 | use crate::{ |
9 | db::RootDatabase, | 9 | db::RootDatabase, |
10 | name_kind::{ | 10 | name_kind::{classify_name, classify_name_ref, Definition, NameKind::*}, |
11 | classify_name, classify_name_ref, | 11 | search_scope::find_refs, |
12 | NameKind::{self, *}, | ||
13 | }, | ||
14 | FileId, FilePosition, FileRange, FileSystemEdit, NavigationTarget, RangeInfo, SourceChange, | 12 | FileId, FilePosition, FileRange, FileSystemEdit, NavigationTarget, RangeInfo, SourceChange, |
15 | SourceFileEdit, TextRange, | 13 | SourceFileEdit, TextRange, |
16 | }; | 14 | }; |
@@ -58,9 +56,9 @@ pub(crate) fn find_all_refs( | |||
58 | ) -> Option<RangeInfo<ReferenceSearchResult>> { | 56 | ) -> Option<RangeInfo<ReferenceSearchResult>> { |
59 | let parse = db.parse(position.file_id); | 57 | let parse = db.parse(position.file_id); |
60 | let syntax = parse.tree().syntax().clone(); | 58 | let syntax = parse.tree().syntax().clone(); |
61 | let RangeInfo { range, info: (analyzer, name_kind) } = find_name(db, &syntax, position)?; | 59 | let RangeInfo { range, info: (name, def) } = find_name(db, &syntax, position)?; |
62 | 60 | ||
63 | let declaration = match name_kind { | 61 | let declaration = match def.item { |
64 | Macro(mac) => NavigationTarget::from_macro_def(db, mac), | 62 | Macro(mac) => NavigationTarget::from_macro_def(db, mac), |
65 | FieldAccess(field) => NavigationTarget::from_field(db, field), | 63 | FieldAccess(field) => NavigationTarget::from_field(db, field), |
66 | AssocItem(assoc) => NavigationTarget::from_assoc_item(db, assoc), | 64 | AssocItem(assoc) => NavigationTarget::from_assoc_item(db, assoc), |
@@ -74,14 +72,19 @@ pub(crate) fn find_all_refs( | |||
74 | GenericParam(_) => return None, | 72 | GenericParam(_) => return None, |
75 | }; | 73 | }; |
76 | 74 | ||
77 | let references = match name_kind { | 75 | // let references = match name_kind { |
78 | Pat((_, pat)) => analyzer | 76 | // Pat((_, pat)) => analyzer |
79 | .find_all_refs(&pat.to_node(&syntax)) | 77 | // .find_all_refs(&pat.to_node(&syntax)) |
80 | .into_iter() | 78 | // .into_iter() |
81 | .map(move |ref_desc| FileRange { file_id: position.file_id, range: ref_desc.range }) | 79 | // .map(move |ref_desc| FileRange { file_id: position.file_id, range: ref_desc.range }) |
82 | .collect::<Vec<_>>(), | 80 | // .collect::<Vec<_>>(), |
83 | _ => vec![], | 81 | // _ => vec![], |
84 | }; | 82 | // }; |
83 | let references = find_refs(db, def, name); | ||
84 | let references = references | ||
85 | .into_iter() | ||
86 | .map(move |ref_desc| FileRange { file_id: position.file_id, range: ref_desc.range }) | ||
87 | .collect::<Vec<_>>(); | ||
85 | 88 | ||
86 | return Some(RangeInfo::new(range, ReferenceSearchResult { declaration, references })); | 89 | return Some(RangeInfo::new(range, ReferenceSearchResult { declaration, references })); |
87 | 90 | ||
@@ -89,18 +92,17 @@ pub(crate) fn find_all_refs( | |||
89 | db: &RootDatabase, | 92 | db: &RootDatabase, |
90 | syntax: &SyntaxNode, | 93 | syntax: &SyntaxNode, |
91 | position: FilePosition, | 94 | position: FilePosition, |
92 | ) -> Option<RangeInfo<(hir::SourceAnalyzer, NameKind)>> { | 95 | ) -> Option<RangeInfo<(String, Definition)>> { |
93 | if let Some(name) = find_node_at_offset::<ast::Name>(&syntax, position.offset) { | 96 | if let Some(name) = find_node_at_offset::<ast::Name>(&syntax, position.offset) { |
94 | let analyzer = hir::SourceAnalyzer::new(db, position.file_id, name.syntax(), None); | 97 | let def = classify_name(db, position.file_id, &name)?; |
95 | let name_kind = classify_name(db, position.file_id, &name)?.item; | ||
96 | let range = name.syntax().text_range(); | 98 | let range = name.syntax().text_range(); |
97 | return Some(RangeInfo::new(range, (analyzer, name_kind))); | 99 | return Some(RangeInfo::new(range, (name.text().to_string(), def))); |
98 | } | 100 | } |
99 | let name_ref = find_node_at_offset::<ast::NameRef>(&syntax, position.offset)?; | 101 | let name_ref = find_node_at_offset::<ast::NameRef>(&syntax, position.offset)?; |
100 | let range = name_ref.syntax().text_range(); | 102 | let range = name_ref.syntax().text_range(); |
101 | let analyzer = hir::SourceAnalyzer::new(db, position.file_id, name_ref.syntax(), None); | 103 | let analyzer = hir::SourceAnalyzer::new(db, position.file_id, name_ref.syntax(), None); |
102 | let name_kind = classify_name_ref(db, position.file_id, &analyzer, &name_ref)?.item; | 104 | let def = classify_name_ref(db, position.file_id, &analyzer, &name_ref)?; |
103 | Some(RangeInfo::new(range, (analyzer, name_kind))) | 105 | Some(RangeInfo::new(range, (name_ref.text().to_string(), def))) |
104 | } | 106 | } |
105 | } | 107 | } |
106 | 108 | ||
@@ -271,12 +273,16 @@ mod tests { | |||
271 | let code = r#" | 273 | let code = r#" |
272 | //- /lib.rs | 274 | //- /lib.rs |
273 | struct Foo { | 275 | struct Foo { |
274 | spam<|>: u32, | 276 | pub spam<|>: u32, |
277 | } | ||
278 | |||
279 | fn main(s: Foo) { | ||
280 | let f = s.spam; | ||
275 | } | 281 | } |
276 | "#; | 282 | "#; |
277 | 283 | ||
278 | let refs = get_all_refs(code); | 284 | let refs = get_all_refs(code); |
279 | assert_eq!(refs.len(), 1); | 285 | assert_eq!(refs.len(), 2); |
280 | } | 286 | } |
281 | 287 | ||
282 | #[test] | 288 | #[test] |