diff options
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs index 6bf949654..484f668d0 100644 --- a/crates/ra_hir/src/nameres.rs +++ b/crates/ra_hir/src/nameres.rs | |||
@@ -22,7 +22,7 @@ use ra_syntax::{ | |||
22 | SyntaxKind::{self, *}, | 22 | SyntaxKind::{self, *}, |
23 | ast::{self, AstNode} | 23 | ast::{self, AstNode} |
24 | }; | 24 | }; |
25 | use ra_db::{SourceRootId, Cancelable, FileId}; | 25 | use ra_db::{SourceRootId, FileId}; |
26 | 26 | ||
27 | use crate::{ | 27 | use crate::{ |
28 | HirFileId, | 28 | HirFileId, |
@@ -319,30 +319,26 @@ where | |||
319 | } | 319 | } |
320 | } | 320 | } |
321 | 321 | ||
322 | pub(crate) fn resolve(mut self) -> Cancelable<ItemMap> { | 322 | pub(crate) fn resolve(mut self) -> ItemMap { |
323 | for (&module_id, items) in self.input.iter() { | 323 | for (&module_id, items) in self.input.iter() { |
324 | self.populate_module(module_id, Arc::clone(items))?; | 324 | self.populate_module(module_id, Arc::clone(items)); |
325 | } | 325 | } |
326 | 326 | ||
327 | loop { | 327 | loop { |
328 | let processed_imports_count = self.processed_imports.len(); | 328 | let processed_imports_count = self.processed_imports.len(); |
329 | for &module_id in self.input.keys() { | 329 | for &module_id in self.input.keys() { |
330 | self.db.check_canceled()?; | 330 | self.db.check_canceled(); |
331 | self.resolve_imports(module_id)?; | 331 | self.resolve_imports(module_id); |
332 | } | 332 | } |
333 | if processed_imports_count == self.processed_imports.len() { | 333 | if processed_imports_count == self.processed_imports.len() { |
334 | // no new imports resolved | 334 | // no new imports resolved |
335 | break; | 335 | break; |
336 | } | 336 | } |
337 | } | 337 | } |
338 | Ok(self.result) | 338 | self.result |
339 | } | 339 | } |
340 | 340 | ||
341 | fn populate_module( | 341 | fn populate_module(&mut self, module_id: ModuleId, input: Arc<InputModuleItems>) { |
342 | &mut self, | ||
343 | module_id: ModuleId, | ||
344 | input: Arc<InputModuleItems>, | ||
345 | ) -> Cancelable<()> { | ||
346 | let mut module_items = ModuleScope::default(); | 342 | let mut module_items = ModuleScope::default(); |
347 | 343 | ||
348 | // Populate extern crates prelude | 344 | // Populate extern crates prelude |
@@ -353,8 +349,8 @@ where | |||
353 | if let Some(crate_id) = crate_graph.crate_id_for_crate_root(file_id.as_original_file()) | 349 | if let Some(crate_id) = crate_graph.crate_id_for_crate_root(file_id.as_original_file()) |
354 | { | 350 | { |
355 | let krate = Crate::new(crate_id); | 351 | let krate = Crate::new(crate_id); |
356 | for dep in krate.dependencies(self.db)? { | 352 | for dep in krate.dependencies(self.db) { |
357 | if let Some(module) = dep.krate.root_module(self.db)? { | 353 | if let Some(module) = dep.krate.root_module(self.db) { |
358 | let def_id = module.def_id; | 354 | let def_id = module.def_id; |
359 | self.add_module_item( | 355 | self.add_module_item( |
360 | &mut module_items, | 356 | &mut module_items, |
@@ -415,7 +411,6 @@ where | |||
415 | } | 411 | } |
416 | 412 | ||
417 | self.result.per_module.insert(module_id, module_items); | 413 | self.result.per_module.insert(module_id, module_items); |
418 | Ok(()) | ||
419 | } | 414 | } |
420 | 415 | ||
421 | fn add_module_item(&self, module_items: &mut ModuleScope, name: Name, def_id: PerNs<DefId>) { | 416 | fn add_module_item(&self, module_items: &mut ModuleScope, name: Name, def_id: PerNs<DefId>) { |
@@ -426,24 +421,23 @@ where | |||
426 | module_items.items.insert(name, resolution); | 421 | module_items.items.insert(name, resolution); |
427 | } | 422 | } |
428 | 423 | ||
429 | fn resolve_imports(&mut self, module_id: ModuleId) -> Cancelable<()> { | 424 | fn resolve_imports(&mut self, module_id: ModuleId) { |
430 | for (i, import) in self.input[&module_id].imports.iter().enumerate() { | 425 | for (i, import) in self.input[&module_id].imports.iter().enumerate() { |
431 | if self.processed_imports.contains(&(module_id, i)) { | 426 | if self.processed_imports.contains(&(module_id, i)) { |
432 | // already done | 427 | // already done |
433 | continue; | 428 | continue; |
434 | } | 429 | } |
435 | if self.resolve_import(module_id, import)? { | 430 | if self.resolve_import(module_id, import) { |
436 | log::debug!("import {:?} resolved (or definite error)", import); | 431 | log::debug!("import {:?} resolved (or definite error)", import); |
437 | self.processed_imports.insert((module_id, i)); | 432 | self.processed_imports.insert((module_id, i)); |
438 | } | 433 | } |
439 | } | 434 | } |
440 | Ok(()) | ||
441 | } | 435 | } |
442 | 436 | ||
443 | fn resolve_import(&mut self, module_id: ModuleId, import: &Import) -> Cancelable<bool> { | 437 | fn resolve_import(&mut self, module_id: ModuleId, import: &Import) -> bool { |
444 | log::debug!("resolving import: {:?}", import); | 438 | log::debug!("resolving import: {:?}", import); |
445 | let ptr = match import.kind { | 439 | let ptr = match import.kind { |
446 | ImportKind::Glob => return Ok(false), | 440 | ImportKind::Glob => return false, |
447 | ImportKind::Named(ptr) => ptr, | 441 | ImportKind::Named(ptr) => ptr, |
448 | }; | 442 | }; |
449 | 443 | ||
@@ -455,7 +449,7 @@ where | |||
455 | None => { | 449 | None => { |
456 | // TODO: error | 450 | // TODO: error |
457 | log::debug!("super path in root module"); | 451 | log::debug!("super path in root module"); |
458 | return Ok(true); // this can't suddenly resolve if we just resolve some other imports | 452 | return true; // this can't suddenly resolve if we just resolve some other imports |
459 | } | 453 | } |
460 | } | 454 | } |
461 | } | 455 | } |
@@ -469,7 +463,7 @@ where | |||
469 | Some(res) if !res.def_id.is_none() => res.def_id, | 463 | Some(res) if !res.def_id.is_none() => res.def_id, |
470 | _ => { | 464 | _ => { |
471 | log::debug!("path segment {:?} not found", name); | 465 | log::debug!("path segment {:?} not found", name); |
472 | return Ok(false); | 466 | return false; |
473 | } | 467 | } |
474 | }; | 468 | }; |
475 | 469 | ||
@@ -481,7 +475,7 @@ where | |||
481 | "path segment {:?} resolved to value only, but is not last", | 475 | "path segment {:?} resolved to value only, but is not last", |
482 | name | 476 | name |
483 | ); | 477 | ); |
484 | return Ok(false); | 478 | return false; |
485 | }; | 479 | }; |
486 | curr = match type_def_id.loc(self.db) { | 480 | curr = match type_def_id.loc(self.db) { |
487 | DefLoc { | 481 | DefLoc { |
@@ -499,7 +493,7 @@ where | |||
499 | kind: PathKind::Crate, | 493 | kind: PathKind::Crate, |
500 | }; | 494 | }; |
501 | log::debug!("resolving {:?} in other source root", path); | 495 | log::debug!("resolving {:?} in other source root", path); |
502 | let def_id = module.resolve_path(self.db, &path)?; | 496 | let def_id = module.resolve_path(self.db, &path); |
503 | if !def_id.is_none() { | 497 | if !def_id.is_none() { |
504 | let name = path.segments.last().unwrap(); | 498 | let name = path.segments.last().unwrap(); |
505 | self.update(module_id, |items| { | 499 | self.update(module_id, |items| { |
@@ -515,10 +509,10 @@ where | |||
515 | import, | 509 | import, |
516 | def_id.map(|did| did.loc(self.db)) | 510 | def_id.map(|did| did.loc(self.db)) |
517 | ); | 511 | ); |
518 | return Ok(true); | 512 | return true; |
519 | } else { | 513 | } else { |
520 | log::debug!("rest of path did not resolve in other source root"); | 514 | log::debug!("rest of path did not resolve in other source root"); |
521 | return Ok(true); | 515 | return true; |
522 | } | 516 | } |
523 | } | 517 | } |
524 | } | 518 | } |
@@ -528,7 +522,7 @@ where | |||
528 | name, | 522 | name, |
529 | type_def_id.loc(self.db) | 523 | type_def_id.loc(self.db) |
530 | ); | 524 | ); |
531 | return Ok(true); // this resolved to a non-module, so the path won't ever resolve | 525 | return true; // this resolved to a non-module, so the path won't ever resolve |
532 | } | 526 | } |
533 | } | 527 | } |
534 | } else { | 528 | } else { |
@@ -547,7 +541,7 @@ where | |||
547 | }) | 541 | }) |
548 | } | 542 | } |
549 | } | 543 | } |
550 | Ok(true) | 544 | true |
551 | } | 545 | } |
552 | 546 | ||
553 | fn update(&mut self, module_id: ModuleId, f: impl FnOnce(&mut ModuleScope)) { | 547 | fn update(&mut self, module_id: ModuleId, f: impl FnOnce(&mut ModuleScope)) { |