aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres/collector.rs
diff options
context:
space:
mode:
authoruHOOCCOOHu <[email protected]>2019-09-02 07:36:20 +0100
committeruHOOCCOOHu <[email protected]>2019-09-02 07:36:20 +0100
commita66214b34effe1ad7f4351a1b920cf3a8f98d3c0 (patch)
tree21c38c3888edbf0d17b59a4c09494788cea61d1c /crates/ra_hir/src/nameres/collector.rs
parentdfa758f6a9146fbcb5109e7294d0a8e561c77913 (diff)
Fix import strategy of `macro_use` and its test
Diffstat (limited to 'crates/ra_hir/src/nameres/collector.rs')
-rw-r--r--crates/ra_hir/src/nameres/collector.rs21
1 files changed, 12 insertions, 9 deletions
diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs
index 26158b5c3..dbd687236 100644
--- a/crates/ra_hir/src/nameres/collector.rs
+++ b/crates/ra_hir/src/nameres/collector.rs
@@ -157,6 +157,10 @@ where
157 // crate root, even if the parent modules is **not** visible. 157 // crate root, even if the parent modules is **not** visible.
158 if export { 158 if export {
159 self.update(self.def_map.root, None, &[(name.clone(), def.clone())]); 159 self.update(self.def_map.root, None, &[(name.clone(), def.clone())]);
160
161 // Exported macros are collected in crate level ready for
162 // glob import with `#[macro_use]`.
163 self.def_map.exported_macros.insert(name.clone(), macro_id);
160 } 164 }
161 self.update(module_id, None, &[(name.clone(), def)]); 165 self.update(module_id, None, &[(name.clone(), def)]);
162 self.global_macro_scope.insert(name, macro_id); 166 self.global_macro_scope.insert(name, macro_id);
@@ -295,20 +299,18 @@ where
295 } 299 }
296 } 300 }
297 301
298 // `#[macro_use] extern crate` glob import macros 302 // `#[macro_use] extern crate` glob imports all macros exported,
303 // ignoring their scopes
299 if import.is_extern_crate && import.is_macro_use { 304 if import.is_extern_crate && import.is_macro_use {
300 if let Some(ModuleDef::Module(m)) = 305 if let Some(ModuleDef::Module(m)) =
301 def.a().and_then(|item| item.take_types()) 306 def.a().and_then(|item| item.take_types())
302 { 307 {
308 tested_by!(macro_rules_from_other_crates_are_visible_with_macro_use);
309
303 let item_map = self.db.crate_def_map(m.krate); 310 let item_map = self.db.crate_def_map(m.krate);
304 let scope = &item_map[m.module_id].scope; 311 for (name, &macro_id) in &item_map.exported_macros {
305 let macros = scope 312 self.define_macro(module_id, name.clone(), macro_id, false);
306 .macros 313 }
307 .iter()
308 .map(|(name, res)| (name.clone(), Either::B(*res)))
309 .collect::<Vec<_>>();
310
311 self.update(module_id, Some(import_id), &macros);
312 } 314 }
313 } 315 }
314 316
@@ -877,6 +879,7 @@ mod tests {
877 root, 879 root,
878 modules, 880 modules,
879 poison_macros: FxHashSet::default(), 881 poison_macros: FxHashSet::default(),
882 exported_macros: FxHashMap::default(),
880 diagnostics: Vec::new(), 883 diagnostics: Vec::new(),
881 } 884 }
882 }; 885 };