aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r--crates/ra_hir/src/nameres.rs42
1 files changed, 18 insertions, 24 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index e51cbe786..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};
25use ra_db::{SourceRootId, Cancelable, FileId}; 25use ra_db::{SourceRootId, FileId};
26 26
27use crate::{ 27use 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
@@ -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)) {