diff options
author | uHOOCCOOHu <[email protected]> | 2019-09-05 11:39:56 +0100 |
---|---|---|
committer | uHOOCCOOHu <[email protected]> | 2019-09-05 11:50:04 +0100 |
commit | 67d33cc21a84e38d97cbf2cedcafac0089aa9162 (patch) | |
tree | 9523cfe7f2d14a084434a154ec03486e177c95a0 /crates/ra_hir/src/nameres/collector.rs | |
parent | dec43a0c5dd164279f94e9ab6e6d69ec28e294fd (diff) |
Hoist macros from extern crate with macro_use
Diffstat (limited to 'crates/ra_hir/src/nameres/collector.rs')
-rw-r--r-- | crates/ra_hir/src/nameres/collector.rs | 28 |
1 files changed, 17 insertions, 11 deletions
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 | |||
531 | self.def_collector.import_all_macros_exported(prelude_module); | 531 | self.def_collector.import_all_macros_exported(prelude_module); |
532 | } | 532 | } |
533 | 533 | ||
534 | // This should be processed eagerly instead of deferred to resolving. | ||
535 | // `#[macro_use] extern crate` is hoisted to imports macros before collecting | ||
536 | // any other items. | ||
537 | for item in items { | ||
538 | if let raw::RawItem::Import(import_id) = *item { | ||
539 | let import = self.raw_items[import_id].clone(); | ||
540 | if import.is_extern_crate && import.is_macro_use { | ||
541 | self.def_collector.import_macros_from_extern_crate(&import); | ||
542 | } | ||
543 | } | ||
544 | } | ||
545 | |||
534 | for item in items { | 546 | for item in items { |
535 | match *item { | 547 | match *item { |
536 | raw::RawItem::Module(m) => self.collect_module(&self.raw_items[m]), | 548 | raw::RawItem::Module(m) => self.collect_module(&self.raw_items[m]), |
537 | raw::RawItem::Import(import_id) => { | 549 | raw::RawItem::Import(import_id) => self.def_collector.unresolved_imports.push(( |
538 | let import = self.raw_items[import_id].clone(); | 550 | self.module_id, |
539 | // This should be processed eagerly instead of deferred to resolving. | 551 | import_id, |
540 | // Otherwise, since it will only mutate `global_macro_scope` | 552 | self.raw_items[import_id].clone(), |
541 | // without `update` names in `mod`s, unresolved macros cannot be expanded. | 553 | )), |
542 | if import.is_extern_crate && import.is_macro_use { | ||
543 | self.def_collector.import_macros_from_extern_crate(&import); | ||
544 | } | ||
545 | |||
546 | self.def_collector.unresolved_imports.push((self.module_id, import_id, import)); | ||
547 | } | ||
548 | raw::RawItem::Def(def) => self.define_def(&self.raw_items[def]), | 554 | raw::RawItem::Def(def) => self.define_def(&self.raw_items[def]), |
549 | raw::RawItem::Macro(mac) => self.collect_macro(&self.raw_items[mac]), | 555 | raw::RawItem::Macro(mac) => self.collect_macro(&self.raw_items[mac]), |
550 | } | 556 | } |