diff options
Diffstat (limited to 'crates/ra_hir_def/src/nameres')
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 20 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/raw.rs | 18 |
2 files changed, 15 insertions, 23 deletions
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index aae3dcadf..7902293e8 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs | |||
@@ -12,7 +12,7 @@ use rustc_hash::FxHashMap; | |||
12 | use test_utils::tested_by; | 12 | use test_utils::tested_by; |
13 | 13 | ||
14 | use crate::{ | 14 | use crate::{ |
15 | attr::Attr, | 15 | attr::Attrs, |
16 | db::DefDatabase2, | 16 | db::DefDatabase2, |
17 | nameres::{ | 17 | nameres::{ |
18 | diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, | 18 | diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, |
@@ -549,7 +549,7 @@ where | |||
549 | // `#[macro_use] extern crate` is hoisted to imports macros before collecting | 549 | // `#[macro_use] extern crate` is hoisted to imports macros before collecting |
550 | // any other items. | 550 | // any other items. |
551 | for item in items { | 551 | for item in items { |
552 | if self.is_cfg_enabled(item.attrs()) { | 552 | if self.is_cfg_enabled(&item.attrs) { |
553 | if let raw::RawItemKind::Import(import_id) = item.kind { | 553 | if let raw::RawItemKind::Import(import_id) = item.kind { |
554 | let import = self.raw_items[import_id].clone(); | 554 | let import = self.raw_items[import_id].clone(); |
555 | if import.is_extern_crate && import.is_macro_use { | 555 | if import.is_extern_crate && import.is_macro_use { |
@@ -560,10 +560,10 @@ where | |||
560 | } | 560 | } |
561 | 561 | ||
562 | for item in items { | 562 | for item in items { |
563 | if self.is_cfg_enabled(item.attrs()) { | 563 | if self.is_cfg_enabled(&item.attrs) { |
564 | match item.kind { | 564 | match item.kind { |
565 | raw::RawItemKind::Module(m) => { | 565 | raw::RawItemKind::Module(m) => { |
566 | self.collect_module(&self.raw_items[m], item.attrs()) | 566 | self.collect_module(&self.raw_items[m], &item.attrs) |
567 | } | 567 | } |
568 | raw::RawItemKind::Import(import_id) => self | 568 | raw::RawItemKind::Import(import_id) => self |
569 | .def_collector | 569 | .def_collector |
@@ -585,9 +585,9 @@ where | |||
585 | } | 585 | } |
586 | } | 586 | } |
587 | 587 | ||
588 | fn collect_module(&mut self, module: &raw::ModuleData, attrs: &[Attr]) { | 588 | fn collect_module(&mut self, module: &raw::ModuleData, attrs: &Attrs) { |
589 | let path_attr = self.path_attr(attrs); | 589 | let path_attr = self.path_attr(attrs); |
590 | let is_macro_use = self.is_macro_use(attrs); | 590 | let is_macro_use = attrs.has_atom("macro_use"); |
591 | match module { | 591 | match module { |
592 | // inline module, just recurse | 592 | // inline module, just recurse |
593 | raw::ModuleData::Definition { name, items, ast_id } => { | 593 | raw::ModuleData::Definition { name, items, ast_id } => { |
@@ -779,17 +779,13 @@ where | |||
779 | } | 779 | } |
780 | } | 780 | } |
781 | 781 | ||
782 | fn is_cfg_enabled(&self, attrs: &[Attr]) -> bool { | 782 | fn is_cfg_enabled(&self, attrs: &Attrs) -> bool { |
783 | attrs.iter().all(|attr| attr.is_cfg_enabled(&self.def_collector.cfg_options) != Some(false)) | 783 | attrs.iter().all(|attr| attr.is_cfg_enabled(&self.def_collector.cfg_options) != Some(false)) |
784 | } | 784 | } |
785 | 785 | ||
786 | fn path_attr<'a>(&self, attrs: &'a [Attr]) -> Option<&'a SmolStr> { | 786 | fn path_attr<'a>(&self, attrs: &'a Attrs) -> Option<&'a SmolStr> { |
787 | attrs.iter().find_map(|attr| attr.as_path()) | 787 | attrs.iter().find_map(|attr| attr.as_path()) |
788 | } | 788 | } |
789 | |||
790 | fn is_macro_use<'a>(&self, attrs: &'a [Attr]) -> bool { | ||
791 | attrs.iter().any(|attr| attr.is_simple_atom("macro_use")) | ||
792 | } | ||
793 | } | 789 | } |
794 | 790 | ||
795 | fn is_macro_rules(path: &Path) -> bool { | 791 | fn is_macro_rules(path: &Path) -> bool { |
diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index 7c68fd638..55a9634f8 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs | |||
@@ -16,7 +16,12 @@ use ra_syntax::{ | |||
16 | }; | 16 | }; |
17 | use test_utils::tested_by; | 17 | use test_utils::tested_by; |
18 | 18 | ||
19 | use crate::{attr::Attr, db::DefDatabase2, path::Path, FileAstId, HirFileId, ModuleSource, Source}; | 19 | use crate::{ |
20 | attr::{Attr, Attrs}, | ||
21 | db::DefDatabase2, | ||
22 | path::Path, | ||
23 | FileAstId, HirFileId, ModuleSource, Source, | ||
24 | }; | ||
20 | 25 | ||
21 | /// `RawItems` is a set of top-level items in a file (except for impls). | 26 | /// `RawItems` is a set of top-level items in a file (except for impls). |
22 | /// | 27 | /// |
@@ -129,21 +134,12 @@ impl Index<Impl> for RawItems { | |||
129 | } | 134 | } |
130 | } | 135 | } |
131 | 136 | ||
132 | // Avoid heap allocation on items without attributes. | ||
133 | type Attrs = Option<Arc<[Attr]>>; | ||
134 | |||
135 | #[derive(Debug, PartialEq, Eq, Clone)] | 137 | #[derive(Debug, PartialEq, Eq, Clone)] |
136 | pub(super) struct RawItem { | 138 | pub(super) struct RawItem { |
137 | attrs: Attrs, | 139 | pub(super) attrs: Attrs, |
138 | pub(super) kind: RawItemKind, | 140 | pub(super) kind: RawItemKind, |
139 | } | 141 | } |
140 | 142 | ||
141 | impl RawItem { | ||
142 | pub(super) fn attrs(&self) -> &[Attr] { | ||
143 | self.attrs.as_ref().map_or(&[], |it| &*it) | ||
144 | } | ||
145 | } | ||
146 | |||
147 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | 143 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] |
148 | pub(super) enum RawItemKind { | 144 | pub(super) enum RawItemKind { |
149 | Module(Module), | 145 | Module(Module), |