From d69023fc72b26e64ebf1f96fc322a2f7377a5f4d Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sat, 2 Feb 2019 00:49:20 +0100 Subject: [PATCH] Lower extern crates to imports This is probably not completely correct, but it kind of works. --- crates/ra_hir/src/nameres/lower.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/crates/ra_hir/src/nameres/lower.rs b/crates/ra_hir/src/nameres/lower.rs index df87f520fab..db898a782fb 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}; use rustc_hash::FxHashMap; use crate::{ - SourceItemId, Path, ModuleSource, Name, + SourceItemId, Path, PathKind, ModuleSource, Name, HirFileId, MacroCallLoc, AsName, PerNs, Function, ModuleDef, Module, Struct, Enum, Const, Static, Trait, Type, ids::LocationCtx, PersistentHirDatabase, @@ -186,8 +186,21 @@ impl LoweredModule { ast::ModuleItemKind::UseItem(it) => { self.add_use_item(source_map, it); } - ast::ModuleItemKind::ExternCrateItem(_) => { - // TODO + ast::ModuleItemKind::ExternCrateItem(it) => { + // Lower `extern crate x` to `use ::x`. This is kind of cheating + // and only works if we always interpret absolute paths in the + // 2018 style; otherwise `::x` could also refer to a module in + // the crate root. + if let Some(name_ref) = it.name_ref() { + let mut path = Path::from_name_ref(name_ref); + path.kind = PathKind::Abs; + let alias = it.alias().and_then(|a| a.name()).map(AsName::as_name); + self.imports.alloc(ImportData { + path, + alias, + is_glob: false, + }); + } } ast::ModuleItemKind::ConstDef(it) => { if let Some(name) = it.name() {