diff options
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs index 028e2bee3..cd7b41cff 100644 --- a/crates/ra_hir/src/nameres.rs +++ b/crates/ra_hir/src/nameres.rs | |||
@@ -287,12 +287,18 @@ where | |||
287 | ) -> ReachedFixedPoint { | 287 | ) -> ReachedFixedPoint { |
288 | log::debug!("resolving import: {:?} ({:?})", import, self.result.edition); | 288 | log::debug!("resolving import: {:?} ({:?})", import, self.result.edition); |
289 | let original_module = Module { krate: self.krate, module_id }; | 289 | let original_module = Module { krate: self.krate, module_id }; |
290 | let (def, reached_fixedpoint) = self.result.resolve_path_fp( | 290 | |
291 | self.db, | 291 | let (def, reached_fixedpoint) = if import.is_extern_crate { |
292 | ResolveMode::Import, | 292 | let res = self.result.resolve_name_in_extern_prelude( |
293 | original_module, | 293 | &import |
294 | &import.path, | 294 | .path |
295 | ); | 295 | .as_ident() |
296 | .expect("extern crate should have been desugared to one-element path"), | ||
297 | ); | ||
298 | (res, if res.is_none() { ReachedFixedPoint::No } else { ReachedFixedPoint::Yes }) | ||
299 | } else { | ||
300 | self.result.resolve_path_fp(self.db, ResolveMode::Import, original_module, &import.path) | ||
301 | }; | ||
296 | 302 | ||
297 | if reached_fixedpoint != ReachedFixedPoint::Yes { | 303 | if reached_fixedpoint != ReachedFixedPoint::Yes { |
298 | return reached_fixedpoint; | 304 | return reached_fixedpoint; |
@@ -502,6 +508,10 @@ impl ItemMap { | |||
502 | from_scope.or(from_extern_prelude).or(from_prelude) | 508 | from_scope.or(from_extern_prelude).or(from_prelude) |
503 | } | 509 | } |
504 | 510 | ||
511 | fn resolve_name_in_extern_prelude(&self, name: &Name) -> PerNs<ModuleDef> { | ||
512 | self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it)) | ||
513 | } | ||
514 | |||
505 | fn resolve_name_in_crate_root_or_extern_prelude( | 515 | fn resolve_name_in_crate_root_or_extern_prelude( |
506 | &self, | 516 | &self, |
507 | db: &impl PersistentHirDatabase, | 517 | db: &impl PersistentHirDatabase, |
@@ -511,8 +521,7 @@ impl ItemMap { | |||
511 | let crate_root = module.crate_root(db); | 521 | let crate_root = module.crate_root(db); |
512 | let from_crate_root = | 522 | let from_crate_root = |
513 | self[crate_root.module_id].items.get(name).map_or(PerNs::none(), |it| it.def); | 523 | self[crate_root.module_id].items.get(name).map_or(PerNs::none(), |it| it.def); |
514 | let from_extern_prelude = | 524 | let from_extern_prelude = self.resolve_name_in_extern_prelude(name); |
515 | self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it)); | ||
516 | 525 | ||
517 | from_crate_root.or(from_extern_prelude) | 526 | from_crate_root.or(from_extern_prelude) |
518 | } | 527 | } |