diff options
Diffstat (limited to 'crates/ra_hir/src/nameres/collector.rs')
-rw-r--r-- | crates/ra_hir/src/nameres/collector.rs | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs index 5dacdb0d9..aa5885f04 100644 --- a/crates/ra_hir/src/nameres/collector.rs +++ b/crates/ra_hir/src/nameres/collector.rs | |||
@@ -2,7 +2,7 @@ | |||
2 | 2 | ||
3 | use ra_cfg::CfgOptions; | 3 | use ra_cfg::CfgOptions; |
4 | use ra_db::FileId; | 4 | use ra_db::FileId; |
5 | use ra_syntax::ast; | 5 | use ra_syntax::{ast, SmolStr}; |
6 | use rustc_hash::FxHashMap; | 6 | use rustc_hash::FxHashMap; |
7 | use test_utils::tested_by; | 7 | use test_utils::tested_by; |
8 | 8 | ||
@@ -546,7 +546,9 @@ where | |||
546 | for item in items { | 546 | for item in items { |
547 | if self.is_cfg_enabled(item.attrs()) { | 547 | if self.is_cfg_enabled(item.attrs()) { |
548 | match item.kind { | 548 | match item.kind { |
549 | raw::RawItemKind::Module(m) => self.collect_module(&self.raw_items[m]), | 549 | raw::RawItemKind::Module(m) => { |
550 | self.collect_module(&self.raw_items[m], item.attrs()) | ||
551 | } | ||
550 | raw::RawItemKind::Import(import_id) => self | 552 | raw::RawItemKind::Import(import_id) => self |
551 | .def_collector | 553 | .def_collector |
552 | .unresolved_imports | 554 | .unresolved_imports |
@@ -558,10 +560,12 @@ where | |||
558 | } | 560 | } |
559 | } | 561 | } |
560 | 562 | ||
561 | fn collect_module(&mut self, module: &raw::ModuleData) { | 563 | fn collect_module(&mut self, module: &raw::ModuleData, attrs: &[Attr]) { |
564 | let path_attr = self.path_attr(attrs); | ||
565 | let is_macro_use = self.is_macro_use(attrs); | ||
562 | match module { | 566 | match module { |
563 | // inline module, just recurse | 567 | // inline module, just recurse |
564 | raw::ModuleData::Definition { name, items, ast_id, attr_path, is_macro_use } => { | 568 | raw::ModuleData::Definition { name, items, ast_id } => { |
565 | let module_id = | 569 | let module_id = |
566 | self.push_child_module(name.clone(), ast_id.with_file_id(self.file_id), None); | 570 | self.push_child_module(name.clone(), ast_id.with_file_id(self.file_id), None); |
567 | 571 | ||
@@ -570,21 +574,21 @@ where | |||
570 | module_id, | 574 | module_id, |
571 | file_id: self.file_id, | 575 | file_id: self.file_id, |
572 | raw_items: self.raw_items, | 576 | raw_items: self.raw_items, |
573 | mod_dir: self.mod_dir.descend_into_definition(name, attr_path.as_ref()), | 577 | mod_dir: self.mod_dir.descend_into_definition(name, path_attr), |
574 | } | 578 | } |
575 | .collect(&*items); | 579 | .collect(&*items); |
576 | if *is_macro_use { | 580 | if is_macro_use { |
577 | self.import_all_legacy_macros(module_id); | 581 | self.import_all_legacy_macros(module_id); |
578 | } | 582 | } |
579 | } | 583 | } |
580 | // out of line module, resolve, parse and recurse | 584 | // out of line module, resolve, parse and recurse |
581 | raw::ModuleData::Declaration { name, ast_id, attr_path, is_macro_use } => { | 585 | raw::ModuleData::Declaration { name, ast_id } => { |
582 | let ast_id = ast_id.with_file_id(self.file_id); | 586 | let ast_id = ast_id.with_file_id(self.file_id); |
583 | match self.mod_dir.resolve_submodule( | 587 | match self.mod_dir.resolve_submodule( |
584 | self.def_collector.db, | 588 | self.def_collector.db, |
585 | self.file_id, | 589 | self.file_id, |
586 | name, | 590 | name, |
587 | attr_path.as_ref(), | 591 | path_attr, |
588 | ) { | 592 | ) { |
589 | Ok((file_id, mod_dir)) => { | 593 | Ok((file_id, mod_dir)) => { |
590 | let module_id = self.push_child_module(name.clone(), ast_id, Some(file_id)); | 594 | let module_id = self.push_child_module(name.clone(), ast_id, Some(file_id)); |
@@ -597,7 +601,7 @@ where | |||
597 | mod_dir, | 601 | mod_dir, |
598 | } | 602 | } |
599 | .collect(raw_items.items()); | 603 | .collect(raw_items.items()); |
600 | if *is_macro_use { | 604 | if is_macro_use { |
601 | self.import_all_legacy_macros(module_id); | 605 | self.import_all_legacy_macros(module_id); |
602 | } | 606 | } |
603 | } | 607 | } |
@@ -713,6 +717,14 @@ where | |||
713 | fn is_cfg_enabled(&self, attrs: &[Attr]) -> bool { | 717 | fn is_cfg_enabled(&self, attrs: &[Attr]) -> bool { |
714 | attrs.iter().all(|attr| attr.is_cfg_enabled(&self.def_collector.cfg_options) != Some(false)) | 718 | attrs.iter().all(|attr| attr.is_cfg_enabled(&self.def_collector.cfg_options) != Some(false)) |
715 | } | 719 | } |
720 | |||
721 | fn path_attr<'a>(&self, attrs: &'a [Attr]) -> Option<&'a SmolStr> { | ||
722 | attrs.iter().find_map(|attr| attr.as_path()) | ||
723 | } | ||
724 | |||
725 | fn is_macro_use<'a>(&self, attrs: &'a [Attr]) -> bool { | ||
726 | attrs.iter().any(|attr| attr.is_simple_atom("macro_use")) | ||
727 | } | ||
716 | } | 728 | } |
717 | 729 | ||
718 | fn is_macro_rules(path: &Path) -> bool { | 730 | fn is_macro_rules(path: &Path) -> bool { |