aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-02-13 19:42:43 +0000
committerFlorian Diebold <[email protected]>2019-02-13 20:13:08 +0000
commit92c595a6a6f7624092432d28ffd7e0ffd189cbda (patch)
treea4a697b02219c22d4be726cf05e68dfb4ba2b108 /crates/ra_hir/src/nameres.rs
parent70839b7ef8217fd019ce5bd3a643a8a16f5fa829 (diff)
Handle extern crates better, so they work correctly in 2015 edition
(see the removed comment.)
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r--crates/ra_hir/src/nameres.rs25
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 }