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.rs27
1 files changed, 15 insertions, 12 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index d649aa820..8b798d6c9 100644
--- a/crates/ra_hir/src/nameres.rs
+++ b/crates/ra_hir/src/nameres.rs
@@ -332,7 +332,8 @@ impl CrateDefMap {
332 let name = path.expand_macro_expr()?; 332 let name = path.expand_macro_expr()?;
333 // search local first 333 // search local first
334 // FIXME: Remove public_macros check when we have a correct local_macors implementation 334 // FIXME: Remove public_macros check when we have a correct local_macors implementation
335 let local = self.public_macros.get(&name).or(self.local_macros.get(&name)).map(|it| *it); 335 let local =
336 self.public_macros.get(&name).or_else(|| self.local_macros.get(&name)).map(|it| *it);
336 if local.is_some() { 337 if local.is_some() {
337 return local; 338 return local;
338 } 339 }
@@ -405,7 +406,7 @@ impl CrateDefMap {
405 }; 406 };
406 407
407 for (i, segment) in segments { 408 for (i, segment) in segments {
408 let curr = match curr_per_ns.as_ref().left().map_or(None, |m| m.as_ref().take_types()) { 409 let curr = match curr_per_ns.as_ref().left().and_then(|m| m.as_ref().take_types()) {
409 Some(r) => r, 410 Some(r) => r,
410 None => { 411 None => {
411 // we still have path segments left, but the path so far 412 // we still have path segments left, but the path so far
@@ -421,10 +422,8 @@ impl CrateDefMap {
421 curr_per_ns = match curr { 422 curr_per_ns = match curr {
422 ModuleDef::Module(module) => { 423 ModuleDef::Module(module) => {
423 if module.krate != self.krate { 424 if module.krate != self.krate {
424 let path = Path { 425 let path =
425 segments: path.segments[i..].iter().cloned().collect(), 426 Path { segments: path.segments[i..].to_vec(), kind: PathKind::Self_ };
426 kind: PathKind::Self_,
427 };
428 log::debug!("resolving {:?} in other crate", path); 427 log::debug!("resolving {:?} in other crate", path);
429 let defp_map = db.crate_def_map(module.krate); 428 let defp_map = db.crate_def_map(module.krate);
430 let (def, s) = 429 let (def, s) =
@@ -468,7 +467,7 @@ impl CrateDefMap {
468 ); 467 );
469 468
470 return ResolvePathResult::with( 469 return ResolvePathResult::with(
471 Either::Left(PerNs::types((*s).into())), 470 Either::Left(PerNs::types(*s)),
472 ReachedFixedPoint::Yes, 471 ReachedFixedPoint::Yes,
473 Some(i), 472 Some(i),
474 ); 473 );
@@ -479,8 +478,10 @@ impl CrateDefMap {
479 } 478 }
480 479
481 fn resolve_name_in_crate_root_or_extern_prelude(&self, name: &Name) -> ItemOrMacro { 480 fn resolve_name_in_crate_root_or_extern_prelude(&self, name: &Name) -> ItemOrMacro {
482 let from_crate_root = 481 let from_crate_root = self[self.root]
483 self[self.root].scope.get_item_or_macro(name).unwrap_or(Either::Left(PerNs::none())); 482 .scope
483 .get_item_or_macro(name)
484 .unwrap_or_else(|| Either::Left(PerNs::none()));
484 let from_extern_prelude = self.resolve_name_in_extern_prelude(name); 485 let from_extern_prelude = self.resolve_name_in_extern_prelude(name);
485 486
486 or(from_crate_root, Either::Left(from_extern_prelude)) 487 or(from_crate_root, Either::Left(from_extern_prelude))
@@ -505,8 +506,10 @@ impl CrateDefMap {
505 // - current module / scope 506 // - current module / scope
506 // - extern prelude 507 // - extern prelude
507 // - std prelude 508 // - std prelude
508 let from_scope = 509 let from_scope = self[module]
509 self[module].scope.get_item_or_macro(name).unwrap_or(Either::Left(PerNs::none()));; 510 .scope
511 .get_item_or_macro(name)
512 .unwrap_or_else(|| Either::Left(PerNs::none()));;
510 let from_extern_prelude = 513 let from_extern_prelude =
511 self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it)); 514 self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it));
512 let from_prelude = self.resolve_in_prelude(db, name); 515 let from_prelude = self.resolve_in_prelude(db, name);
@@ -525,7 +528,7 @@ impl CrateDefMap {
525 } else { 528 } else {
526 db.crate_def_map(prelude.krate)[prelude.module_id].scope.get_item_or_macro(name) 529 db.crate_def_map(prelude.krate)[prelude.module_id].scope.get_item_or_macro(name)
527 }; 530 };
528 resolution.unwrap_or(Either::Left(PerNs::none())) 531 resolution.unwrap_or_else(|| Either::Left(PerNs::none()))
529 } else { 532 } else {
530 Either::Left(PerNs::none()) 533 Either::Left(PerNs::none())
531 } 534 }