diff options
author | Aleksey Kladov <[email protected]> | 2019-11-22 08:27:47 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-11-22 08:27:47 +0000 |
commit | e42f9627664cc3c44094e1c4f985270fbfd592b1 (patch) | |
tree | 81603da9c34f301cf82e1ceae80313b8eb9e10c4 /crates/ra_hir_def/src | |
parent | a1346bba5c457d1aa0a35f44231bed8b494b7d60 (diff) |
Encapsulate Attrs
Diffstat (limited to 'crates/ra_hir_def/src')
-rw-r--r-- | crates/ra_hir_def/src/attr.rs | 36 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 20 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/raw.rs | 18 |
3 files changed, 45 insertions, 29 deletions
diff --git a/crates/ra_hir_def/src/attr.rs b/crates/ra_hir_def/src/attr.rs index 0e961ca12..7a9d0fdf4 100644 --- a/crates/ra_hir_def/src/attr.rs +++ b/crates/ra_hir_def/src/attr.rs | |||
@@ -1,6 +1,6 @@ | |||
1 | //! A higher level attributes based on TokenTree, with also some shortcuts. | 1 | //! A higher level attributes based on TokenTree, with also some shortcuts. |
2 | 2 | ||
3 | use std::sync::Arc; | 3 | use std::{ops, sync::Arc}; |
4 | 4 | ||
5 | use hir_expand::hygiene::Hygiene; | 5 | use hir_expand::hygiene::Hygiene; |
6 | use mbe::ast_to_token_tree; | 6 | use mbe::ast_to_token_tree; |
@@ -13,6 +13,28 @@ use tt::Subtree; | |||
13 | 13 | ||
14 | use crate::path::Path; | 14 | use crate::path::Path; |
15 | 15 | ||
16 | #[derive(Default, Debug, Clone, PartialEq, Eq)] | ||
17 | pub struct Attrs { | ||
18 | entries: Option<Arc<[Attr]>>, | ||
19 | } | ||
20 | |||
21 | impl ops::Deref for Attrs { | ||
22 | type Target = [Attr]; | ||
23 | |||
24 | fn deref(&self) -> &[Attr] { | ||
25 | match &self.entries { | ||
26 | Some(it) => &*it, | ||
27 | None => &[], | ||
28 | } | ||
29 | } | ||
30 | } | ||
31 | |||
32 | impl Attrs { | ||
33 | pub fn has_atom(&self, atom: &str) -> bool { | ||
34 | self.iter().any(|it| it.is_simple_atom(atom)) | ||
35 | } | ||
36 | } | ||
37 | |||
16 | #[derive(Debug, Clone, PartialEq, Eq)] | 38 | #[derive(Debug, Clone, PartialEq, Eq)] |
17 | pub struct Attr { | 39 | pub struct Attr { |
18 | pub(crate) path: Path, | 40 | pub(crate) path: Path, |
@@ -43,13 +65,15 @@ impl Attr { | |||
43 | Some(Attr { path, input }) | 65 | Some(Attr { path, input }) |
44 | } | 66 | } |
45 | 67 | ||
46 | pub fn from_attrs_owner(owner: &dyn AttrsOwner, hygiene: &Hygiene) -> Option<Arc<[Attr]>> { | 68 | pub fn from_attrs_owner(owner: &dyn AttrsOwner, hygiene: &Hygiene) -> Attrs { |
47 | let mut attrs = owner.attrs().peekable(); | 69 | let mut attrs = owner.attrs().peekable(); |
48 | if attrs.peek().is_none() { | 70 | let entries = if attrs.peek().is_none() { |
49 | // Avoid heap allocation | 71 | // Avoid heap allocation |
50 | return None; | 72 | None |
51 | } | 73 | } else { |
52 | Some(attrs.flat_map(|ast| Attr::from_src(ast, hygiene)).collect()) | 74 | Some(attrs.flat_map(|ast| Attr::from_src(ast, hygiene)).collect()) |
75 | }; | ||
76 | Attrs { entries } | ||
53 | } | 77 | } |
54 | 78 | ||
55 | pub fn is_simple_atom(&self, name: &str) -> bool { | 79 | pub fn is_simple_atom(&self, name: &str) -> bool { |
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), |