diff options
Diffstat (limited to 'crates/ra_ide_api/src/references.rs')
-rw-r--r-- | crates/ra_ide_api/src/references.rs | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/crates/ra_ide_api/src/references.rs b/crates/ra_ide_api/src/references.rs index 0af1ae811..1c4cd49dc 100644 --- a/crates/ra_ide_api/src/references.rs +++ b/crates/ra_ide_api/src/references.rs | |||
@@ -50,11 +50,11 @@ pub(crate) fn find_all_refs( | |||
50 | position: FilePosition, | 50 | position: FilePosition, |
51 | ) -> Option<ReferenceSearchResult> { | 51 | ) -> Option<ReferenceSearchResult> { |
52 | let parse = db.parse(position.file_id); | 52 | let parse = db.parse(position.file_id); |
53 | let (binding, analyzer) = find_binding(db, parse.tree(), position)?; | 53 | let (binding, analyzer) = find_binding(db, &parse.tree(), position)?; |
54 | let declaration = NavigationTarget::from_bind_pat(position.file_id, binding); | 54 | let declaration = NavigationTarget::from_bind_pat(position.file_id, &binding); |
55 | 55 | ||
56 | let references = analyzer | 56 | let references = analyzer |
57 | .find_all_refs(binding) | 57 | .find_all_refs(&binding) |
58 | .into_iter() | 58 | .into_iter() |
59 | .map(move |ref_desc| FileRange { file_id: position.file_id, range: ref_desc.range }) | 59 | .map(move |ref_desc| FileRange { file_id: position.file_id, range: ref_desc.range }) |
60 | .collect::<Vec<_>>(); | 60 | .collect::<Vec<_>>(); |
@@ -63,9 +63,9 @@ pub(crate) fn find_all_refs( | |||
63 | 63 | ||
64 | fn find_binding<'a>( | 64 | fn find_binding<'a>( |
65 | db: &RootDatabase, | 65 | db: &RootDatabase, |
66 | source_file: &'a SourceFile, | 66 | source_file: &SourceFile, |
67 | position: FilePosition, | 67 | position: FilePosition, |
68 | ) -> Option<(&'a ast::BindPat, hir::SourceAnalyzer)> { | 68 | ) -> Option<(ast::BindPat, hir::SourceAnalyzer)> { |
69 | let syntax = source_file.syntax(); | 69 | let syntax = source_file.syntax(); |
70 | if let Some(binding) = find_node_at_offset::<ast::BindPat>(syntax, position.offset) { | 70 | if let Some(binding) = find_node_at_offset::<ast::BindPat>(syntax, position.offset) { |
71 | let analyzer = hir::SourceAnalyzer::new(db, position.file_id, binding.syntax(), None); | 71 | let analyzer = hir::SourceAnalyzer::new(db, position.file_id, binding.syntax(), None); |
@@ -73,7 +73,7 @@ pub(crate) fn find_all_refs( | |||
73 | }; | 73 | }; |
74 | let name_ref = find_node_at_offset::<ast::NameRef>(syntax, position.offset)?; | 74 | let name_ref = find_node_at_offset::<ast::NameRef>(syntax, position.offset)?; |
75 | let analyzer = hir::SourceAnalyzer::new(db, position.file_id, name_ref.syntax(), None); | 75 | let analyzer = hir::SourceAnalyzer::new(db, position.file_id, name_ref.syntax(), None); |
76 | let resolved = analyzer.resolve_local_name(name_ref)?; | 76 | let resolved = analyzer.resolve_local_name(&name_ref)?; |
77 | if let Either::A(ptr) = resolved.ptr() { | 77 | if let Either::A(ptr) = resolved.ptr() { |
78 | if let ast::PatKind::BindPat(binding) = ptr.to_node(source_file.syntax()).kind() { | 78 | if let ast::PatKind::BindPat(binding) = ptr.to_node(source_file.syntax()).kind() { |
79 | return Some((binding, analyzer)); | 79 | return Some((binding, analyzer)); |
@@ -89,10 +89,10 @@ pub(crate) fn rename( | |||
89 | new_name: &str, | 89 | new_name: &str, |
90 | ) -> Option<SourceChange> { | 90 | ) -> Option<SourceChange> { |
91 | let parse = db.parse(position.file_id); | 91 | let parse = db.parse(position.file_id); |
92 | let syntax = parse.tree().syntax(); | 92 | if let Some((ast_name, ast_module)) = |
93 | 93 | find_name_and_module_at_offset(parse.tree().syntax(), position) | |
94 | if let Some((ast_name, ast_module)) = find_name_and_module_at_offset(syntax, position) { | 94 | { |
95 | rename_mod(db, ast_name, ast_module, position, new_name) | 95 | rename_mod(db, &ast_name, &ast_module, position, new_name) |
96 | } else { | 96 | } else { |
97 | rename_reference(db, position, new_name) | 97 | rename_reference(db, position, new_name) |
98 | } | 98 | } |
@@ -101,14 +101,10 @@ pub(crate) fn rename( | |||
101 | fn find_name_and_module_at_offset( | 101 | fn find_name_and_module_at_offset( |
102 | syntax: &SyntaxNode, | 102 | syntax: &SyntaxNode, |
103 | position: FilePosition, | 103 | position: FilePosition, |
104 | ) -> Option<(&ast::Name, &ast::Module)> { | 104 | ) -> Option<(ast::Name, ast::Module)> { |
105 | let ast_name = find_node_at_offset::<ast::Name>(syntax, position.offset); | 105 | let ast_name = find_node_at_offset::<ast::Name>(syntax, position.offset)?; |
106 | let ast_name_parent = ast::Module::cast(ast_name?.syntax().parent()?); | 106 | let ast_module = ast::Module::cast(ast_name.syntax().parent()?)?; |
107 | 107 | Some((ast_name, ast_module)) | |
108 | if let (Some(ast_module), Some(name)) = (ast_name_parent, ast_name) { | ||
109 | return Some((name, ast_module)); | ||
110 | } | ||
111 | None | ||
112 | } | 108 | } |
113 | 109 | ||
114 | fn source_edit_from_fileid_range( | 110 | fn source_edit_from_fileid_range( |
@@ -135,7 +131,8 @@ fn rename_mod( | |||
135 | ) -> Option<SourceChange> { | 131 | ) -> Option<SourceChange> { |
136 | let mut source_file_edits = Vec::new(); | 132 | let mut source_file_edits = Vec::new(); |
137 | let mut file_system_edits = Vec::new(); | 133 | let mut file_system_edits = Vec::new(); |
138 | if let Some(module) = source_binder::module_from_declaration(db, position.file_id, &ast_module) | 134 | if let Some(module) = |
135 | source_binder::module_from_declaration(db, position.file_id, ast_module.clone()) | ||
139 | { | 136 | { |
140 | let src = module.definition_source(db); | 137 | let src = module.definition_source(db); |
141 | let file_id = src.file_id.as_original_file(); | 138 | let file_id = src.file_id.as_original_file(); |