aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres/crate_def_map/raw.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-03-13 13:04:28 +0000
committerAleksey Kladov <[email protected]>2019-03-17 09:46:13 +0000
commit182c05a96c25321ac3ff262cea098e0c4d7ed6f8 (patch)
tree151c81b7b5f55dda12a555c69993a86a61b84243 /crates/ra_hir/src/nameres/crate_def_map/raw.rs
parent0d8d9186563637f493ac7691268319373251b18a (diff)
add name resolution from the old impl
unlike the old impl, this also handles macro imports across crates
Diffstat (limited to 'crates/ra_hir/src/nameres/crate_def_map/raw.rs')
-rw-r--r--crates/ra_hir/src/nameres/crate_def_map/raw.rs30
1 files changed, 10 insertions, 20 deletions
diff --git a/crates/ra_hir/src/nameres/crate_def_map/raw.rs b/crates/ra_hir/src/nameres/crate_def_map/raw.rs
index cec2484eb..fe832b8da 100644
--- a/crates/ra_hir/src/nameres/crate_def_map/raw.rs
+++ b/crates/ra_hir/src/nameres/crate_def_map/raw.rs
@@ -18,7 +18,7 @@ use crate::{
18#[derive(Default, PartialEq, Eq)] 18#[derive(Default, PartialEq, Eq)]
19pub(crate) struct RawItems { 19pub(crate) struct RawItems {
20 modules: Arena<Module, ModuleData>, 20 modules: Arena<Module, ModuleData>,
21 imports: Arena<Import, ImportData>, 21 imports: Arena<ImportId, ImportData>,
22 defs: Arena<Def, DefData>, 22 defs: Arena<Def, DefData>,
23 macros: Arena<Macro, MacroData>, 23 macros: Arena<Macro, MacroData>,
24 /// items for top-level module 24 /// items for top-level module
@@ -60,9 +60,9 @@ impl Index<Module> for RawItems {
60 } 60 }
61} 61}
62 62
63impl Index<Import> for RawItems { 63impl Index<ImportId> for RawItems {
64 type Output = ImportData; 64 type Output = ImportData;
65 fn index(&self, idx: Import) -> &ImportData { 65 fn index(&self, idx: ImportId) -> &ImportData {
66 &self.imports[idx] 66 &self.imports[idx]
67 } 67 }
68} 68}
@@ -84,7 +84,7 @@ impl Index<Macro> for RawItems {
84#[derive(PartialEq, Eq, Clone, Copy)] 84#[derive(PartialEq, Eq, Clone, Copy)]
85pub(crate) enum RawItem { 85pub(crate) enum RawItem {
86 Module(Module), 86 Module(Module),
87 Import(Import), 87 Import(ImportId),
88 Def(Def), 88 Def(Def),
89 Macro(Macro), 89 Macro(Macro),
90} 90}
@@ -99,18 +99,8 @@ pub(crate) enum ModuleData {
99 Definition { name: Name, items: Vec<RawItem> }, 99 Definition { name: Name, items: Vec<RawItem> },
100} 100}
101 101
102#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 102pub(crate) use crate::nameres::lower::ImportId;
103pub(crate) struct Import(RawId); 103pub(super) use crate::nameres::lower::ImportData;
104impl_arena_id!(Import);
105
106#[derive(PartialEq, Eq)]
107pub(crate) struct ImportData {
108 path: Path,
109 alias: Option<Name>,
110 is_glob: bool,
111 is_prelude: bool,
112 is_extern_crate: bool,
113}
114 104
115#[derive(Clone, Copy, PartialEq, Eq, Hash)] 105#[derive(Clone, Copy, PartialEq, Eq, Hash)]
116pub(crate) struct Def(RawId); 106pub(crate) struct Def(RawId);
@@ -144,6 +134,7 @@ pub(crate) struct MacroData {
144 pub(crate) path: Path, 134 pub(crate) path: Path,
145 pub(crate) name: Option<Name>, 135 pub(crate) name: Option<Name>,
146 pub(crate) arg: tt::Subtree, 136 pub(crate) arg: tt::Subtree,
137 pub(crate) export: bool,
147} 138}
148 139
149struct RawItemsCollector { 140struct RawItemsCollector {
@@ -215,9 +206,7 @@ impl RawItemsCollector {
215 } 206 }
216 207
217 fn add_use_item(&mut self, current_module: Option<Module>, use_item: &ast::UseItem) { 208 fn add_use_item(&mut self, current_module: Option<Module>, use_item: &ast::UseItem) {
218 let is_prelude = use_item 209 let is_prelude = use_item.has_atom_attr("prelude_import");
219 .attrs()
220 .any(|attr| attr.as_atom().map(|s| s == "prelude_import").unwrap_or(false));
221 210
222 Path::expand_use_item(use_item, |path, segment, alias| { 211 Path::expand_use_item(use_item, |path, segment, alias| {
223 let import = self.raw_items.imports.alloc(ImportData { 212 let import = self.raw_items.imports.alloc(ImportData {
@@ -261,7 +250,8 @@ impl RawItemsCollector {
261 250
262 let name = m.name().map(|it| it.as_name()); 251 let name = m.name().map(|it| it.as_name());
263 let source_item_id = self.source_file_items.id_of_unchecked(m.syntax()); 252 let source_item_id = self.source_file_items.id_of_unchecked(m.syntax());
264 let m = self.raw_items.macros.alloc(MacroData { source_item_id, path, arg, name }); 253 let export = m.has_atom_attr("macro_export");
254 let m = self.raw_items.macros.alloc(MacroData { source_item_id, path, arg, name, export });
265 self.push_item(current_module, RawItem::Macro(m)); 255 self.push_item(current_module, RawItem::Macro(m));
266 } 256 }
267 257