diff options
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 27 |
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 | } |