diff options
author | Florian Diebold <[email protected]> | 2019-02-13 19:42:43 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-02-13 20:13:08 +0000 |
commit | 92c595a6a6f7624092432d28ffd7e0ffd189cbda (patch) | |
tree | a4a697b02219c22d4be726cf05e68dfb4ba2b108 /crates/ra_hir/src/nameres | |
parent | 70839b7ef8217fd019ce5bd3a643a8a16f5fa829 (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.rs | 9 | ||||
-rw-r--r-- | crates/ra_hir/src/nameres/tests.rs | 36 |
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}; | |||
8 | use rustc_hash::FxHashMap; | 8 | use rustc_hash::FxHashMap; |
9 | 9 | ||
10 | use crate::{ | 10 | use 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] |
546 | fn 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] | ||
546 | fn import_across_source_roots() { | 582 | fn import_across_source_roots() { |
547 | let mut db = MockDatabase::with_files( | 583 | let mut db = MockDatabase::with_files( |
548 | " | 584 | " |