diff options
author | uHOOCCOOHu <[email protected]> | 2019-09-02 07:36:20 +0100 |
---|---|---|
committer | uHOOCCOOHu <[email protected]> | 2019-09-02 07:36:20 +0100 |
commit | a66214b34effe1ad7f4351a1b920cf3a8f98d3c0 (patch) | |
tree | 21c38c3888edbf0d17b59a4c09494788cea61d1c /crates/ra_hir/src/nameres/collector.rs | |
parent | dfa758f6a9146fbcb5109e7294d0a8e561c77913 (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.rs | 21 |
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, ¯o_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), ¯os); | ||
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 | }; |