diff options
-rw-r--r-- | crates/ra_cfg/src/cfg_expr.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir/src/attr.rs | 11 | ||||
-rw-r--r-- | crates/ra_hir/src/impl_block.rs | 8 | ||||
-rw-r--r-- | crates/ra_hir/src/nameres/collector.rs | 9 | ||||
-rw-r--r-- | crates/ra_hir/src/nameres/raw.rs | 11 |
5 files changed, 28 insertions, 13 deletions
diff --git a/crates/ra_cfg/src/cfg_expr.rs b/crates/ra_cfg/src/cfg_expr.rs index efeadf462..811f83048 100644 --- a/crates/ra_cfg/src/cfg_expr.rs +++ b/crates/ra_cfg/src/cfg_expr.rs | |||
@@ -15,7 +15,7 @@ pub enum CfgExpr { | |||
15 | 15 | ||
16 | impl CfgExpr { | 16 | impl CfgExpr { |
17 | /// Fold the cfg by querying all basic `Atom` and `KeyValue` predicates. | 17 | /// Fold the cfg by querying all basic `Atom` and `KeyValue` predicates. |
18 | pub fn fold(&self, query: &impl Fn(&SmolStr, Option<&SmolStr>) -> bool) -> Option<bool> { | 18 | pub fn fold(&self, query: &dyn Fn(&SmolStr, Option<&SmolStr>) -> bool) -> Option<bool> { |
19 | match self { | 19 | match self { |
20 | CfgExpr::Invalid => None, | 20 | CfgExpr::Invalid => None, |
21 | CfgExpr::Atom(name) => Some(query(name, None)), | 21 | CfgExpr::Atom(name) => Some(query(name, None)), |
diff --git a/crates/ra_hir/src/attr.rs b/crates/ra_hir/src/attr.rs index 84c36b8da..a8a7e9006 100644 --- a/crates/ra_hir/src/attr.rs +++ b/crates/ra_hir/src/attr.rs | |||
@@ -45,10 +45,15 @@ impl Attr { | |||
45 | 45 | ||
46 | pub(crate) fn from_attrs_owner( | 46 | pub(crate) fn from_attrs_owner( |
47 | file_id: HirFileId, | 47 | file_id: HirFileId, |
48 | owner: &impl AttrsOwner, | 48 | owner: &dyn AttrsOwner, |
49 | db: &impl AstDatabase, | 49 | db: &impl AstDatabase, |
50 | ) -> Arc<[Attr]> { | 50 | ) -> Option<Arc<[Attr]>> { |
51 | owner.attrs().flat_map(|ast| Attr::from_src(Source { file_id, ast }, db)).collect() | 51 | let mut attrs = owner.attrs().peekable(); |
52 | if attrs.peek().is_none() { | ||
53 | // Avoid heap allocation | ||
54 | return None; | ||
55 | } | ||
56 | Some(attrs.flat_map(|ast| Attr::from_src(Source { file_id, ast }, db)).collect()) | ||
52 | } | 57 | } |
53 | 58 | ||
54 | pub(crate) fn is_simple_atom(&self, name: &str) -> bool { | 59 | pub(crate) fn is_simple_atom(&self, name: &str) -> bool { |
diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs index 7877c3171..55dfc393b 100644 --- a/crates/ra_hir/src/impl_block.rs +++ b/crates/ra_hir/src/impl_block.rs | |||
@@ -213,7 +213,9 @@ impl ModuleImplBlocks { | |||
213 | match item { | 213 | match item { |
214 | ast::ItemOrMacro::Item(ast::ModuleItem::ImplBlock(impl_block_ast)) => { | 214 | ast::ItemOrMacro::Item(ast::ModuleItem::ImplBlock(impl_block_ast)) => { |
215 | let attrs = Attr::from_attrs_owner(file_id, &impl_block_ast, db); | 215 | let attrs = Attr::from_attrs_owner(file_id, &impl_block_ast, db); |
216 | if attrs.iter().any(|attr| attr.is_cfg_enabled(cfg_options) == Some(false)) { | 216 | if attrs.map_or(false, |attrs| { |
217 | attrs.iter().any(|attr| attr.is_cfg_enabled(cfg_options) == Some(false)) | ||
218 | }) { | ||
217 | continue; | 219 | continue; |
218 | } | 220 | } |
219 | 221 | ||
@@ -228,7 +230,9 @@ impl ModuleImplBlocks { | |||
228 | ast::ItemOrMacro::Item(_) => (), | 230 | ast::ItemOrMacro::Item(_) => (), |
229 | ast::ItemOrMacro::Macro(macro_call) => { | 231 | ast::ItemOrMacro::Macro(macro_call) => { |
230 | let attrs = Attr::from_attrs_owner(file_id, ¯o_call, db); | 232 | let attrs = Attr::from_attrs_owner(file_id, ¯o_call, db); |
231 | if attrs.iter().any(|attr| attr.is_cfg_enabled(cfg_options) == Some(false)) { | 233 | if attrs.map_or(false, |attrs| { |
234 | attrs.iter().any(|attr| attr.is_cfg_enabled(cfg_options) == Some(false)) | ||
235 | }) { | ||
232 | continue; | 236 | continue; |
233 | } | 237 | } |
234 | 238 | ||
diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs index 1d79cbd8c..cef2dc9d2 100644 --- a/crates/ra_hir/src/nameres/collector.rs +++ b/crates/ra_hir/src/nameres/collector.rs | |||
@@ -7,7 +7,6 @@ use rustc_hash::FxHashMap; | |||
7 | use test_utils::tested_by; | 7 | use test_utils::tested_by; |
8 | 8 | ||
9 | use crate::{ | 9 | use crate::{ |
10 | attr::Attr, | ||
11 | db::DefDatabase, | 10 | db::DefDatabase, |
12 | ids::{AstItemDef, LocationCtx, MacroCallId, MacroCallLoc, MacroDefId, MacroFileKind}, | 11 | ids::{AstItemDef, LocationCtx, MacroCallId, MacroCallLoc, MacroDefId, MacroFileKind}, |
13 | name::MACRO_RULES, | 12 | name::MACRO_RULES, |
@@ -715,8 +714,12 @@ where | |||
715 | } | 714 | } |
716 | } | 715 | } |
717 | 716 | ||
718 | fn is_cfg_enabled(&self, attrs: &[Attr]) -> bool { | 717 | fn is_cfg_enabled(&self, attrs: &raw::Attrs) -> bool { |
719 | attrs.iter().all(|attr| attr.is_cfg_enabled(&self.def_collector.cfg_options) != Some(false)) | 718 | attrs.as_ref().map_or(true, |attrs| { |
719 | attrs | ||
720 | .iter() | ||
721 | .all(|attr| attr.is_cfg_enabled(&self.def_collector.cfg_options) != Some(false)) | ||
722 | }) | ||
720 | } | 723 | } |
721 | } | 724 | } |
722 | 725 | ||
diff --git a/crates/ra_hir/src/nameres/raw.rs b/crates/ra_hir/src/nameres/raw.rs index f02d4eb7a..623b343c4 100644 --- a/crates/ra_hir/src/nameres/raw.rs +++ b/crates/ra_hir/src/nameres/raw.rs | |||
@@ -120,9 +120,12 @@ impl Index<Macro> for RawItems { | |||
120 | } | 120 | } |
121 | } | 121 | } |
122 | 122 | ||
123 | // Avoid heap allocation on items without attributes. | ||
124 | pub(super) type Attrs = Option<Arc<[Attr]>>; | ||
125 | |||
123 | #[derive(Debug, PartialEq, Eq, Clone)] | 126 | #[derive(Debug, PartialEq, Eq, Clone)] |
124 | pub(super) struct RawItem { | 127 | pub(super) struct RawItem { |
125 | pub(super) attrs: Arc<[Attr]>, | 128 | pub(super) attrs: Attrs, |
126 | pub(super) kind: RawItemKind, | 129 | pub(super) kind: RawItemKind, |
127 | } | 130 | } |
128 | 131 | ||
@@ -390,7 +393,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> { | |||
390 | fn push_import( | 393 | fn push_import( |
391 | &mut self, | 394 | &mut self, |
392 | current_module: Option<Module>, | 395 | current_module: Option<Module>, |
393 | attrs: Arc<[Attr]>, | 396 | attrs: Attrs, |
394 | data: ImportData, | 397 | data: ImportData, |
395 | source: ImportSourcePtr, | 398 | source: ImportSourcePtr, |
396 | ) { | 399 | ) { |
@@ -399,7 +402,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> { | |||
399 | self.push_item(current_module, attrs, RawItemKind::Import(import)) | 402 | self.push_item(current_module, attrs, RawItemKind::Import(import)) |
400 | } | 403 | } |
401 | 404 | ||
402 | fn push_item(&mut self, current_module: Option<Module>, attrs: Arc<[Attr]>, kind: RawItemKind) { | 405 | fn push_item(&mut self, current_module: Option<Module>, attrs: Attrs, kind: RawItemKind) { |
403 | match current_module { | 406 | match current_module { |
404 | Some(module) => match &mut self.raw_items.modules[module] { | 407 | Some(module) => match &mut self.raw_items.modules[module] { |
405 | ModuleData::Definition { items, .. } => items, | 408 | ModuleData::Definition { items, .. } => items, |
@@ -410,7 +413,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> { | |||
410 | .push(RawItem { attrs, kind }) | 413 | .push(RawItem { attrs, kind }) |
411 | } | 414 | } |
412 | 415 | ||
413 | fn parse_attrs(&self, item: &impl ast::AttrsOwner) -> Arc<[Attr]> { | 416 | fn parse_attrs(&self, item: &impl ast::AttrsOwner) -> Attrs { |
414 | Attr::from_attrs_owner(self.file_id, item, self.db) | 417 | Attr::from_attrs_owner(self.file_id, item, self.db) |
415 | } | 418 | } |
416 | } | 419 | } |