diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-10-20 13:51:30 +0100 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-10-20 13:51:30 +0100 |
commit | 2ded93a78a108c1f7e0dd0a9036c88c786f21dce (patch) | |
tree | 4656be95dde6ebd9a38e680dba161aa53357acfb /crates/ra_analysis/src | |
parent | 4dbf0379ccd5c7643d48658f0ecc224add5a5c5c (diff) | |
parent | 3de77908eb52362e1acc3feed6186a18d8026f6e (diff) |
Merge #143
143: Implement Find All References and Rename for local variables r=matklad a=kjeremy
Expose `find_all_refs` in `Analysis`. This currently only works for local variables.
Use this in the LSP to implement find all references and rename.
Co-authored-by: Jeremy A. Kolb <[email protected]>
Diffstat (limited to 'crates/ra_analysis/src')
-rw-r--r-- | crates/ra_analysis/src/imp.rs | 32 | ||||
-rw-r--r-- | crates/ra_analysis/src/lib.rs | 3 |
2 files changed, 35 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(); |
diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index 2eeacaabe..46cc0722b 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs | |||
@@ -217,6 +217,9 @@ impl Analysis { | |||
217 | self.imp | 217 | self.imp |
218 | .approximately_resolve_symbol(file_id, offset, token) | 218 | .approximately_resolve_symbol(file_id, offset, token) |
219 | } | 219 | } |
220 | pub fn find_all_refs(&self, file_id: FileId, offset: TextUnit, token: &JobToken) -> Vec<(FileId, TextRange)> { | ||
221 | self.imp.find_all_refs(file_id, offset, token) | ||
222 | } | ||
220 | pub fn parent_module(&self, file_id: FileId) -> Vec<(FileId, FileSymbol)> { | 223 | pub fn parent_module(&self, file_id: FileId) -> Vec<(FileId, FileSymbol)> { |
221 | self.imp.parent_module(file_id) | 224 | self.imp.parent_module(file_id) |
222 | } | 225 | } |