diff options
-rw-r--r-- | crates/ra_ide_api/src/imp.rs | 54 | ||||
-rw-r--r-- | crates/ra_ide_api/src/lib.rs | 2 | ||||
-rw-r--r-- | crates/ra_ide_api/src/references.rs | 66 |
3 files changed, 55 insertions, 67 deletions
diff --git a/crates/ra_ide_api/src/imp.rs b/crates/ra_ide_api/src/imp.rs index dea71740c..435cc7d4b 100644 --- a/crates/ra_ide_api/src/imp.rs +++ b/crates/ra_ide_api/src/imp.rs | |||
@@ -2,11 +2,7 @@ use hir::{ | |||
2 | self, Problem, source_binder | 2 | self, Problem, source_binder |
3 | }; | 3 | }; |
4 | use ra_ide_api_light::{self, LocalEdit, Severity}; | 4 | use ra_ide_api_light::{self, LocalEdit, Severity}; |
5 | use ra_syntax::{ | 5 | use ra_syntax::ast; |
6 | algo::find_node_at_offset, ast::{self, NameOwner}, AstNode, | ||
7 | SourceFile, | ||
8 | TextRange, | ||
9 | }; | ||
10 | use ra_db::SourceDatabase; | 6 | use ra_db::SourceDatabase; |
11 | 7 | ||
12 | use crate::{ | 8 | use crate::{ |
@@ -16,54 +12,6 @@ use crate::{ | |||
16 | }; | 12 | }; |
17 | 13 | ||
18 | impl db::RootDatabase { | 14 | impl db::RootDatabase { |
19 | pub(crate) fn find_all_refs(&self, position: FilePosition) -> Vec<(FileId, TextRange)> { | ||
20 | let file = self.parse(position.file_id); | ||
21 | // Find the binding associated with the offset | ||
22 | let (binding, descr) = match find_binding(self, &file, position) { | ||
23 | None => return Vec::new(), | ||
24 | Some(it) => it, | ||
25 | }; | ||
26 | |||
27 | let mut ret = binding | ||
28 | .name() | ||
29 | .into_iter() | ||
30 | .map(|name| (position.file_id, name.syntax().range())) | ||
31 | .collect::<Vec<_>>(); | ||
32 | ret.extend( | ||
33 | descr | ||
34 | .scopes(self) | ||
35 | .find_all_refs(binding) | ||
36 | .into_iter() | ||
37 | .map(|ref_desc| (position.file_id, ref_desc.range)), | ||
38 | ); | ||
39 | |||
40 | return ret; | ||
41 | |||
42 | fn find_binding<'a>( | ||
43 | db: &db::RootDatabase, | ||
44 | source_file: &'a SourceFile, | ||
45 | position: FilePosition, | ||
46 | ) -> Option<(&'a ast::BindPat, hir::Function)> { | ||
47 | let syntax = source_file.syntax(); | ||
48 | if let Some(binding) = find_node_at_offset::<ast::BindPat>(syntax, position.offset) { | ||
49 | let descr = source_binder::function_from_child_node( | ||
50 | db, | ||
51 | position.file_id, | ||
52 | binding.syntax(), | ||
53 | )?; | ||
54 | return Some((binding, descr)); | ||
55 | }; | ||
56 | let name_ref = find_node_at_offset::<ast::NameRef>(syntax, position.offset)?; | ||
57 | let descr = | ||
58 | source_binder::function_from_child_node(db, position.file_id, name_ref.syntax())?; | ||
59 | let scope = descr.scopes(db); | ||
60 | let resolved = scope.resolve_local_name(name_ref)?; | ||
61 | let resolved = resolved.ptr().to_node(source_file); | ||
62 | let binding = find_node_at_offset::<ast::BindPat>(syntax, resolved.range().end())?; | ||
63 | Some((binding, descr)) | ||
64 | } | ||
65 | } | ||
66 | |||
67 | pub(crate) fn diagnostics(&self, file_id: FileId) -> Vec<Diagnostic> { | 15 | pub(crate) fn diagnostics(&self, file_id: FileId) -> Vec<Diagnostic> { |
68 | let syntax = self.parse(file_id); | 16 | let syntax = self.parse(file_id); |
69 | 17 | ||
diff --git a/crates/ra_ide_api/src/lib.rs b/crates/ra_ide_api/src/lib.rs index 0bb21245d..f5c1aa036 100644 --- a/crates/ra_ide_api/src/lib.rs +++ b/crates/ra_ide_api/src/lib.rs | |||
@@ -322,7 +322,7 @@ impl Analysis { | |||
322 | 322 | ||
323 | /// Finds all usages of the reference at point. | 323 | /// Finds all usages of the reference at point. |
324 | pub fn find_all_refs(&self, position: FilePosition) -> Cancelable<Vec<(FileId, TextRange)>> { | 324 | pub fn find_all_refs(&self, position: FilePosition) -> Cancelable<Vec<(FileId, TextRange)>> { |
325 | self.with_db(|db| db.find_all_refs(position)) | 325 | self.with_db(|db| references::find_all_refs(db, position)) |
326 | } | 326 | } |
327 | 327 | ||
328 | /// Returns a short text descrbing element at position. | 328 | /// Returns a short text descrbing element at position. |
diff --git a/crates/ra_ide_api/src/references.rs b/crates/ra_ide_api/src/references.rs index 1c9491a0a..b129f3134 100644 --- a/crates/ra_ide_api/src/references.rs +++ b/crates/ra_ide_api/src/references.rs | |||
@@ -1,13 +1,10 @@ | |||
1 | use relative_path::RelativePathBuf; | 1 | use relative_path::{RelativePath, RelativePathBuf}; |
2 | 2 | use hir::{ModuleSource, source_binder}; | |
3 | use hir::{ | 3 | use ra_db::{FileId, SourceDatabase}; |
4 | self, ModuleSource, source_binder::module_from_declaration, | ||
5 | }; | ||
6 | use ra_syntax::{ | 4 | use ra_syntax::{ |
5 | AstNode, SyntaxNode, TextRange, SourceFile, | ||
6 | ast::{self, NameOwner}, | ||
7 | algo::find_node_at_offset, | 7 | algo::find_node_at_offset, |
8 | ast, | ||
9 | AstNode, | ||
10 | SyntaxNode | ||
11 | }; | 8 | }; |
12 | 9 | ||
13 | use crate::{ | 10 | use crate::{ |
@@ -17,8 +14,51 @@ use crate::{ | |||
17 | SourceChange, | 14 | SourceChange, |
18 | SourceFileEdit, | 15 | SourceFileEdit, |
19 | }; | 16 | }; |
20 | use ra_db::SourceDatabase; | 17 | |
21 | use relative_path::RelativePath; | 18 | pub(crate) fn find_all_refs(db: &RootDatabase, position: FilePosition) -> Vec<(FileId, TextRange)> { |
19 | let file = db.parse(position.file_id); | ||
20 | // Find the binding associated with the offset | ||
21 | let (binding, descr) = match find_binding(db, &file, position) { | ||
22 | None => return Vec::new(), | ||
23 | Some(it) => it, | ||
24 | }; | ||
25 | |||
26 | let mut ret = binding | ||
27 | .name() | ||
28 | .into_iter() | ||
29 | .map(|name| (position.file_id, name.syntax().range())) | ||
30 | .collect::<Vec<_>>(); | ||
31 | ret.extend( | ||
32 | descr | ||
33 | .scopes(db) | ||
34 | .find_all_refs(binding) | ||
35 | .into_iter() | ||
36 | .map(|ref_desc| (position.file_id, ref_desc.range)), | ||
37 | ); | ||
38 | |||
39 | return ret; | ||
40 | |||
41 | fn find_binding<'a>( | ||
42 | db: &RootDatabase, | ||
43 | source_file: &'a SourceFile, | ||
44 | position: FilePosition, | ||
45 | ) -> Option<(&'a ast::BindPat, hir::Function)> { | ||
46 | let syntax = source_file.syntax(); | ||
47 | if let Some(binding) = find_node_at_offset::<ast::BindPat>(syntax, position.offset) { | ||
48 | let descr = | ||
49 | source_binder::function_from_child_node(db, position.file_id, binding.syntax())?; | ||
50 | return Some((binding, descr)); | ||
51 | }; | ||
52 | let name_ref = find_node_at_offset::<ast::NameRef>(syntax, position.offset)?; | ||
53 | let descr = | ||
54 | source_binder::function_from_child_node(db, position.file_id, name_ref.syntax())?; | ||
55 | let scope = descr.scopes(db); | ||
56 | let resolved = scope.resolve_local_name(name_ref)?; | ||
57 | let resolved = resolved.ptr().to_node(source_file); | ||
58 | let binding = find_node_at_offset::<ast::BindPat>(syntax, resolved.range().end())?; | ||
59 | Some((binding, descr)) | ||
60 | } | ||
61 | } | ||
22 | 62 | ||
23 | pub(crate) fn rename( | 63 | pub(crate) fn rename( |
24 | db: &RootDatabase, | 64 | db: &RootDatabase, |
@@ -57,7 +97,8 @@ fn rename_mod( | |||
57 | ) -> Option<SourceChange> { | 97 | ) -> Option<SourceChange> { |
58 | let mut source_file_edits = Vec::new(); | 98 | let mut source_file_edits = Vec::new(); |
59 | let mut file_system_edits = Vec::new(); | 99 | let mut file_system_edits = Vec::new(); |
60 | if let Some(module) = module_from_declaration(db, position.file_id, &ast_module) { | 100 | if let Some(module) = source_binder::module_from_declaration(db, position.file_id, &ast_module) |
101 | { | ||
61 | let (file_id, module_source) = module.definition_source(db); | 102 | let (file_id, module_source) = module.definition_source(db); |
62 | match module_source { | 103 | match module_source { |
63 | ModuleSource::SourceFile(..) => { | 104 | ModuleSource::SourceFile(..) => { |
@@ -108,8 +149,7 @@ fn rename_reference( | |||
108 | position: FilePosition, | 149 | position: FilePosition, |
109 | new_name: &str, | 150 | new_name: &str, |
110 | ) -> Option<SourceChange> { | 151 | ) -> Option<SourceChange> { |
111 | let edit = db | 152 | let edit = find_all_refs(db, position) |
112 | .find_all_refs(position) | ||
113 | .iter() | 153 | .iter() |
114 | .map(|(file_id, text_range)| SourceFileEdit { | 154 | .map(|(file_id, text_range)| SourceFileEdit { |
115 | file_id: *file_id, | 155 | file_id: *file_id, |