diff options
Diffstat (limited to 'crates/ra_analysis')
-rw-r--r-- | crates/ra_analysis/src/completion/reference_completion.rs | 2 | ||||
-rw-r--r-- | crates/ra_analysis/src/db.rs | 9 | ||||
-rw-r--r-- | crates/ra_analysis/src/imp.rs | 46 | ||||
-rw-r--r-- | crates/ra_analysis/src/lib.rs | 2 |
4 files changed, 31 insertions, 28 deletions
diff --git a/crates/ra_analysis/src/completion/reference_completion.rs b/crates/ra_analysis/src/completion/reference_completion.rs index 8ea7478a8..f483ed045 100644 --- a/crates/ra_analysis/src/completion/reference_completion.rs +++ b/crates/ra_analysis/src/completion/reference_completion.rs | |||
@@ -163,7 +163,7 @@ fn complete_path( | |||
163 | }; | 163 | }; |
164 | let target_module = match def_id.resolve(db)? { | 164 | let target_module = match def_id.resolve(db)? { |
165 | Def::Module(it) => it, | 165 | Def::Module(it) => it, |
166 | Def::Item => return Ok(()), | 166 | _ => return Ok(()), |
167 | }; | 167 | }; |
168 | let module_scope = target_module.scope(db)?; | 168 | let module_scope = target_module.scope(db)?; |
169 | let completions = module_scope.entries().map(|(name, _res)| CompletionItem { | 169 | let completions = module_scope.entries().map(|(name, _res)| CompletionItem { |
diff --git a/crates/ra_analysis/src/db.rs b/crates/ra_analysis/src/db.rs index df2ef293d..b8d774eb5 100644 --- a/crates/ra_analysis/src/db.rs +++ b/crates/ra_analysis/src/db.rs | |||
@@ -1,7 +1,7 @@ | |||
1 | use std::sync::Arc; | 1 | use std::sync::Arc; |
2 | use salsa::{self, Database}; | 2 | use salsa::{self, Database}; |
3 | use ra_db::{LocationIntener, BaseDatabase}; | 3 | use ra_db::{LocationIntener, BaseDatabase}; |
4 | use hir::{self, DefId, DefLoc, FnId, SourceItemId}; | 4 | use hir::{self, DefId, DefLoc}; |
5 | 5 | ||
6 | use crate::{ | 6 | use crate::{ |
7 | symbol_index, | 7 | symbol_index, |
@@ -15,7 +15,6 @@ pub(crate) struct RootDatabase { | |||
15 | 15 | ||
16 | #[derive(Debug, Default)] | 16 | #[derive(Debug, Default)] |
17 | struct IdMaps { | 17 | struct IdMaps { |
18 | fns: LocationIntener<SourceItemId, FnId>, | ||
19 | defs: LocationIntener<DefLoc, DefId>, | 18 | defs: LocationIntener<DefLoc, DefId>, |
20 | } | 19 | } |
21 | 20 | ||
@@ -58,12 +57,6 @@ impl AsRef<LocationIntener<DefLoc, DefId>> for RootDatabase { | |||
58 | } | 57 | } |
59 | } | 58 | } |
60 | 59 | ||
61 | impl AsRef<LocationIntener<hir::SourceItemId, FnId>> for RootDatabase { | ||
62 | fn as_ref(&self) -> &LocationIntener<hir::SourceItemId, FnId> { | ||
63 | &self.id_maps.fns | ||
64 | } | ||
65 | } | ||
66 | |||
67 | salsa::database_storage! { | 60 | salsa::database_storage! { |
68 | pub(crate) struct RootDatabaseStorage for RootDatabase { | 61 | pub(crate) struct RootDatabaseStorage for RootDatabase { |
69 | impl ra_db::FilesDatabase { | 62 | impl ra_db::FilesDatabase { |
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index f5cb3550e..fe1dfefea 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs | |||
@@ -190,10 +190,7 @@ impl AnalysisImpl { | |||
190 | Some(it) => it, | 190 | Some(it) => it, |
191 | }; | 191 | }; |
192 | let root = descr.crate_root(); | 192 | let root = descr.crate_root(); |
193 | let file_id = root | 193 | let file_id = root.source().file_id(); |
194 | .source() | ||
195 | .as_file() | ||
196 | .expect("root module always has a file as a source"); | ||
197 | 194 | ||
198 | let crate_graph = self.db.crate_graph(); | 195 | let crate_graph = self.db.crate_graph(); |
199 | let crate_id = crate_graph.crate_id_for_crate_root(file_id); | 196 | let crate_id = crate_graph.crate_id_for_crate_root(file_id); |
@@ -213,7 +210,7 @@ impl AnalysisImpl { | |||
213 | let syntax = file.syntax(); | 210 | let syntax = file.syntax(); |
214 | if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(syntax, position.offset) { | 211 | if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(syntax, position.offset) { |
215 | if let Some(fn_descr) = | 212 | if let Some(fn_descr) = |
216 | hir::Function::guess_for_name_ref(&*self.db, position.file_id, name_ref) | 213 | hir::Function::guess_for_name_ref(&*self.db, position.file_id, name_ref)? |
217 | { | 214 | { |
218 | let scope = fn_descr.scope(&*self.db); | 215 | let scope = fn_descr.scope(&*self.db); |
219 | // First try to resolve the symbol locally | 216 | // First try to resolve the symbol locally |
@@ -260,11 +257,11 @@ impl AnalysisImpl { | |||
260 | Ok(vec![]) | 257 | Ok(vec![]) |
261 | } | 258 | } |
262 | 259 | ||
263 | pub fn find_all_refs(&self, position: FilePosition) -> Vec<(FileId, TextRange)> { | 260 | pub fn find_all_refs(&self, position: FilePosition) -> Cancelable<Vec<(FileId, TextRange)>> { |
264 | let file = self.db.source_file(position.file_id); | 261 | let file = self.db.source_file(position.file_id); |
265 | // Find the binding associated with the offset | 262 | // Find the binding associated with the offset |
266 | let (binding, descr) = match find_binding(&self.db, &file, position) { | 263 | let (binding, descr) = match find_binding(&self.db, &file, position)? { |
267 | None => return Vec::new(), | 264 | None => return Ok(Vec::new()), |
268 | Some(it) => it, | 265 | Some(it) => it, |
269 | }; | 266 | }; |
270 | 267 | ||
@@ -277,25 +274,36 @@ impl AnalysisImpl { | |||
277 | .map(|ref_desc| (position.file_id, ref_desc.range)), | 274 | .map(|ref_desc| (position.file_id, ref_desc.range)), |
278 | ); | 275 | ); |
279 | 276 | ||
280 | return ret; | 277 | return Ok(ret); |
281 | 278 | ||
282 | fn find_binding<'a>( | 279 | fn find_binding<'a>( |
283 | db: &db::RootDatabase, | 280 | db: &db::RootDatabase, |
284 | source_file: &'a SourceFileNode, | 281 | source_file: &'a SourceFileNode, |
285 | position: FilePosition, | 282 | position: FilePosition, |
286 | ) -> Option<(ast::BindPat<'a>, hir::Function)> { | 283 | ) -> Cancelable<Option<(ast::BindPat<'a>, hir::Function)>> { |
287 | let syntax = source_file.syntax(); | 284 | let syntax = source_file.syntax(); |
288 | if let Some(binding) = find_node_at_offset::<ast::BindPat>(syntax, position.offset) { | 285 | if let Some(binding) = find_node_at_offset::<ast::BindPat>(syntax, position.offset) { |
289 | let descr = hir::Function::guess_for_bind_pat(db, position.file_id, binding)?; | 286 | let descr = ctry!(hir::Function::guess_for_bind_pat( |
290 | return Some((binding, descr)); | 287 | db, |
288 | position.file_id, | ||
289 | binding | ||
290 | )?); | ||
291 | return Ok(Some((binding, descr))); | ||
291 | }; | 292 | }; |
292 | let name_ref = find_node_at_offset::<ast::NameRef>(syntax, position.offset)?; | 293 | let name_ref = ctry!(find_node_at_offset::<ast::NameRef>(syntax, position.offset)); |
293 | let descr = hir::Function::guess_for_name_ref(db, position.file_id, name_ref)?; | 294 | let descr = ctry!(hir::Function::guess_for_name_ref( |
295 | db, | ||
296 | position.file_id, | ||
297 | name_ref | ||
298 | )?); | ||
294 | let scope = descr.scope(db); | 299 | let scope = descr.scope(db); |
295 | let resolved = scope.resolve_local_name(name_ref)?; | 300 | let resolved = ctry!(scope.resolve_local_name(name_ref)); |
296 | let resolved = resolved.ptr().resolve(source_file); | 301 | let resolved = resolved.ptr().resolve(source_file); |
297 | let binding = find_node_at_offset::<ast::BindPat>(syntax, resolved.range().end())?; | 302 | let binding = ctry!(find_node_at_offset::<ast::BindPat>( |
298 | Some((binding, descr)) | 303 | syntax, |
304 | resolved.range().end() | ||
305 | )); | ||
306 | Ok(Some((binding, descr))) | ||
299 | } | 307 | } |
300 | } | 308 | } |
301 | 309 | ||
@@ -411,7 +419,9 @@ impl AnalysisImpl { | |||
411 | if fs.kind == FN_DEF { | 419 | if fs.kind == FN_DEF { |
412 | let fn_file = self.db.source_file(fn_file_id); | 420 | let fn_file = self.db.source_file(fn_file_id); |
413 | if let Some(fn_def) = find_node_at_offset(fn_file.syntax(), fs.node_range.start()) { | 421 | if let Some(fn_def) = find_node_at_offset(fn_file.syntax(), fs.node_range.start()) { |
414 | let descr = hir::Function::guess_from_source(&*self.db, fn_file_id, fn_def); | 422 | let descr = ctry!(hir::Function::guess_from_source( |
423 | &*self.db, fn_file_id, fn_def | ||
424 | )?); | ||
415 | if let Some(descriptor) = descr.signature_info(&*self.db) { | 425 | if let Some(descriptor) = descr.signature_info(&*self.db) { |
416 | // If we have a calling expression let's find which argument we are on | 426 | // If we have a calling expression let's find which argument we are on |
417 | let mut current_parameter = None; | 427 | let mut current_parameter = None; |
diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index 12df580ba..90528edfd 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs | |||
@@ -248,7 +248,7 @@ impl Analysis { | |||
248 | self.imp.approximately_resolve_symbol(position) | 248 | self.imp.approximately_resolve_symbol(position) |
249 | } | 249 | } |
250 | pub fn find_all_refs(&self, position: FilePosition) -> Cancelable<Vec<(FileId, TextRange)>> { | 250 | pub fn find_all_refs(&self, position: FilePosition) -> Cancelable<Vec<(FileId, TextRange)>> { |
251 | Ok(self.imp.find_all_refs(position)) | 251 | self.imp.find_all_refs(position) |
252 | } | 252 | } |
253 | pub fn doc_comment_for( | 253 | pub fn doc_comment_for( |
254 | &self, | 254 | &self, |