Hoist macros from extern crate with macro_use

This commit is contained in:
uHOOCCOOHu 2019-09-05 18:39:56 +08:00
parent dec43a0c5d
commit 67d33cc21a
No known key found for this signature in database
GPG Key ID: CED392DE0C483D00
2 changed files with 20 additions and 14 deletions

View File

@ -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]),
}

View File

@ -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);