aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/imp.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_analysis/src/imp.rs')
-rw-r--r--crates/ra_analysis/src/imp.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs
index f1403cb5d..a67b1717a 100644
--- a/crates/ra_analysis/src/imp.rs
+++ b/crates/ra_analysis/src/imp.rs
@@ -257,6 +257,38 @@ impl AnalysisImpl {
257 vec![] 257 vec![]
258 } 258 }
259 259
260 pub fn find_all_refs(&self, file_id: FileId, offset: TextUnit, _token: &JobToken) -> Vec<(FileId, TextRange)> {
261 let root = self.root(file_id);
262 let file = root.syntax(file_id);
263 let syntax = file.syntax();
264
265 let mut ret = vec![];
266
267 // Find the symbol we are looking for
268 if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(syntax, offset) {
269
270 // We are only handing local references for now
271 if let Some(resolved) = resolve_local_name(&file, offset, name_ref) {
272
273 ret.push((file_id, resolved.1));
274
275 if let Some(fn_def) = find_node_at_offset::<ast::FnDef>(syntax, offset) {
276
277 let refs : Vec<_> = fn_def.syntax().descendants()
278 .filter_map(ast::NameRef::cast)
279 .filter(|n: &ast::NameRef| resolve_local_name(&file, n.syntax().range().start(), *n) == Some(resolved.clone()))
280 .collect();
281
282 for r in refs {
283 ret.push((file_id, r.syntax().range()));
284 }
285 }
286 }
287 }
288
289 ret
290 }
291
260 pub fn diagnostics(&self, file_id: FileId) -> Vec<Diagnostic> { 292 pub fn diagnostics(&self, file_id: FileId) -> Vec<Diagnostic> {
261 let root = self.root(file_id); 293 let root = self.root(file_id);
262 let module_tree = root.module_tree(); 294 let module_tree = root.module_tree();