From 67d33cc21a84e38d97cbf2cedcafac0089aa9162 Mon Sep 17 00:00:00 2001 From: uHOOCCOOHu Date: Thu, 5 Sep 2019 18:39:56 +0800 Subject: Hoist macros from extern crate with macro_use --- crates/ra_hir/src/nameres/collector.rs | 28 +++++++++++++++++----------- crates/ra_hir/src/nameres/tests/macros.rs | 6 +++--- 2 files changed, 20 insertions(+), 14 deletions(-) (limited to 'crates/ra_hir/src/nameres') diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs index 3e689e360..698e40247 100644 --- a/crates/ra_hir/src/nameres/collector.rs +++ b/crates/ra_hir/src/nameres/collector.rs @@ -531,20 +531,26 @@ where self.def_collector.import_all_macros_exported(prelude_module); } + // This should be processed eagerly instead of deferred to resolving. + // `#[macro_use] extern crate` is hoisted to imports macros before collecting + // any other items. + for item in items { + if let raw::RawItem::Import(import_id) = *item { + let import = self.raw_items[import_id].clone(); + if import.is_extern_crate && import.is_macro_use { + self.def_collector.import_macros_from_extern_crate(&import); + } + } + } + for item in items { match *item { raw::RawItem::Module(m) => self.collect_module(&self.raw_items[m]), - raw::RawItem::Import(import_id) => { - let import = self.raw_items[import_id].clone(); - // This should be processed eagerly instead of deferred to resolving. - // Otherwise, since it will only mutate `global_macro_scope` - // without `update` names in `mod`s, unresolved macros cannot be expanded. - if import.is_extern_crate && import.is_macro_use { - self.def_collector.import_macros_from_extern_crate(&import); - } - - self.def_collector.unresolved_imports.push((self.module_id, import_id, import)); - } + raw::RawItem::Import(import_id) => self.def_collector.unresolved_imports.push(( + self.module_id, + import_id, + self.raw_items[import_id].clone(), + )), raw::RawItem::Def(def) => self.define_def(&self.raw_items[def]), raw::RawItem::Macro(mac) => self.collect_macro(&self.raw_items[mac]), } diff --git a/crates/ra_hir/src/nameres/tests/macros.rs b/crates/ra_hir/src/nameres/tests/macros.rs index 8fcd86bfe..aece1515b 100644 --- a/crates/ra_hir/src/nameres/tests/macros.rs +++ b/crates/ra_hir/src/nameres/tests/macros.rs @@ -144,9 +144,6 @@ fn macro_rules_from_other_crates_are_visible_with_macro_use() { let map = def_map_with_crate_graph( " //- /main.rs - #[macro_use] - extern crate foo; - structs!(Foo); structs_priv!(Bar); structs_not_exported!(MacroNotResolved1); @@ -154,6 +151,9 @@ fn macro_rules_from_other_crates_are_visible_with_macro_use() { mod bar; + #[macro_use] + extern crate foo; + //- /bar.rs structs!(Baz); crate::structs!(MacroNotResolved3); -- cgit v1.2.3