aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/references.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/references.rs')
-rw-r--r--crates/ra_ide_api/src/references.rs50
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
8use crate::{ 8use 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]