aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres
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
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')
-rw-r--r--crates/ra_hir/src/nameres/lower.rs9
-rw-r--r--crates/ra_hir/src/nameres/tests.rs36
2 files changed, 38 insertions, 7 deletions
diff --git a/crates/ra_hir/src/nameres/lower.rs b/crates/ra_hir/src/nameres/lower.rs
index 922dbe9c1..81d80654c 100644
--- a/crates/ra_hir/src/nameres/lower.rs
+++ b/crates/ra_hir/src/nameres/lower.rs
@@ -8,7 +8,7 @@ use ra_arena::{Arena, RawId, impl_arena_id, map::ArenaMap};
8use rustc_hash::FxHashMap; 8use rustc_hash::FxHashMap;
9 9
10use crate::{ 10use crate::{
11 SourceItemId, Path, PathKind, ModuleSource, Name, 11 SourceItemId, Path, ModuleSource, Name,
12 HirFileId, MacroCallLoc, AsName, PerNs, Function, 12 HirFileId, MacroCallLoc, AsName, PerNs, Function,
13 ModuleDef, Module, Struct, Enum, Const, Static, Trait, Type, 13 ModuleDef, Module, Struct, Enum, Const, Static, Trait, Type,
14 ids::LocationCtx, PersistentHirDatabase, 14 ids::LocationCtx, PersistentHirDatabase,
@@ -180,13 +180,8 @@ impl LoweredModule {
180 self.add_use_item(source_map, it); 180 self.add_use_item(source_map, it);
181 } 181 }
182 ast::ModuleItemKind::ExternCrateItem(it) => { 182 ast::ModuleItemKind::ExternCrateItem(it) => {
183 // Lower `extern crate x` to `use ::x`. This is kind of cheating
184 // and only works if we always interpret absolute paths in the
185 // 2018 style; otherwise `::x` could also refer to a module in
186 // the crate root.
187 if let Some(name_ref) = it.name_ref() { 183 if let Some(name_ref) = it.name_ref() {
188 let mut path = Path::from_name_ref(name_ref); 184 let path = Path::from_name_ref(name_ref);
189 path.kind = PathKind::Abs;
190 let alias = it.alias().and_then(|a| a.name()).map(AsName::as_name); 185 let alias = it.alias().and_then(|a| a.name()).map(AsName::as_name);
191 self.imports.alloc(ImportData { 186 self.imports.alloc(ImportData {
192 path, 187 path,
diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir/src/nameres/tests.rs
index e764e0855..6402c89c0 100644
--- a/crates/ra_hir/src/nameres/tests.rs
+++ b/crates/ra_hir/src/nameres/tests.rs
@@ -543,6 +543,42 @@ fn extern_crate_rename() {
543} 543}
544 544
545#[test] 545#[test]
546fn extern_crate_rename_2015_edition() {
547 let mut db = MockDatabase::with_files(
548 "
549 //- /main.rs
550 extern crate alloc as alloc_crate;
551
552 mod alloc;
553 mod sync;
554
555 //- /sync.rs
556 use alloc_crate::Arc;
557
558 //- /lib.rs
559 struct Arc;
560 ",
561 );
562 db.set_crate_graph_from_fixture(crate_graph! {
563 "main": ("/main.rs", "2015", ["alloc"]),
564 "alloc": ("/lib.rs", []),
565 });
566 let sync_id = db.file_id_of("/sync.rs");
567
568 let module = crate::source_binder::module_from_file_id(&db, sync_id).unwrap();
569 let krate = module.krate(&db).unwrap();
570 let item_map = db.item_map(krate);
571
572 check_module_item_map(
573 &item_map,
574 module.module_id,
575 "
576 Arc: t v
577 ",
578 );
579}
580
581#[test]
546fn import_across_source_roots() { 582fn import_across_source_roots() {
547 let mut db = MockDatabase::with_files( 583 let mut db = MockDatabase::with_files(
548 " 584 "