diff options
Diffstat (limited to 'crates/ra_hir/src/nameres/per_ns.rs')
-rw-r--r-- | crates/ra_hir/src/nameres/per_ns.rs | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/crates/ra_hir/src/nameres/per_ns.rs b/crates/ra_hir/src/nameres/per_ns.rs index c40a3ff9d..6a50e05c1 100644 --- a/crates/ra_hir/src/nameres/per_ns.rs +++ b/crates/ra_hir/src/nameres/per_ns.rs | |||
@@ -1,78 +1,93 @@ | |||
1 | use crate::MacroDef; | ||
2 | |||
1 | #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] | 3 | #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] |
2 | pub enum Namespace { | 4 | pub enum Namespace { |
3 | Types, | 5 | Types, |
4 | Values, | 6 | Values, |
7 | Macro, | ||
5 | } | 8 | } |
6 | 9 | ||
7 | #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] | 10 | #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] |
8 | pub struct PerNs<T> { | 11 | pub struct PerNs<T> { |
9 | pub types: Option<T>, | 12 | pub types: Option<T>, |
10 | pub values: Option<T>, | 13 | pub values: Option<T>, |
14 | /// Since macros has different type, many methods simply ignore it. | ||
15 | /// We can only use special method like `get_macros` to access it. | ||
16 | pub macros: Option<MacroDef>, | ||
11 | } | 17 | } |
12 | 18 | ||
13 | impl<T> Default for PerNs<T> { | 19 | impl<T> Default for PerNs<T> { |
14 | fn default() -> Self { | 20 | fn default() -> Self { |
15 | PerNs { types: None, values: None } | 21 | PerNs { types: None, values: None, macros: None } |
16 | } | 22 | } |
17 | } | 23 | } |
18 | 24 | ||
19 | impl<T> PerNs<T> { | 25 | impl<T> PerNs<T> { |
20 | pub fn none() -> PerNs<T> { | 26 | pub fn none() -> PerNs<T> { |
21 | PerNs { types: None, values: None } | 27 | PerNs { types: None, values: None, macros: None } |
22 | } | 28 | } |
23 | 29 | ||
24 | pub fn values(t: T) -> PerNs<T> { | 30 | pub fn values(t: T) -> PerNs<T> { |
25 | PerNs { types: None, values: Some(t) } | 31 | PerNs { types: None, values: Some(t), macros: None } |
26 | } | 32 | } |
27 | 33 | ||
28 | pub fn types(t: T) -> PerNs<T> { | 34 | pub fn types(t: T) -> PerNs<T> { |
29 | PerNs { types: Some(t), values: None } | 35 | PerNs { types: Some(t), values: None, macros: None } |
30 | } | 36 | } |
31 | 37 | ||
32 | pub fn both(types: T, values: T) -> PerNs<T> { | 38 | pub fn both(types: T, values: T) -> PerNs<T> { |
33 | PerNs { types: Some(types), values: Some(values) } | 39 | PerNs { types: Some(types), values: Some(values), macros: None } |
34 | } | 40 | } |
35 | 41 | ||
36 | pub fn is_none(&self) -> bool { | 42 | pub fn macros(macro_: MacroDef) -> PerNs<T> { |
37 | self.types.is_none() && self.values.is_none() | 43 | PerNs { types: None, values: None, macros: Some(macro_) } |
38 | } | 44 | } |
39 | 45 | ||
40 | pub fn is_both(&self) -> bool { | 46 | pub fn is_none(&self) -> bool { |
41 | self.types.is_some() && self.values.is_some() | 47 | self.types.is_none() && self.values.is_none() && self.macros.is_none() |
42 | } | 48 | } |
43 | 49 | ||
44 | pub fn take(self, namespace: Namespace) -> Option<T> { | 50 | pub fn is_all(&self) -> bool { |
45 | match namespace { | 51 | self.types.is_some() && self.values.is_some() && self.macros.is_some() |
46 | Namespace::Types => self.types, | ||
47 | Namespace::Values => self.values, | ||
48 | } | ||
49 | } | 52 | } |
50 | 53 | ||
51 | pub fn take_types(self) -> Option<T> { | 54 | pub fn take_types(self) -> Option<T> { |
52 | self.take(Namespace::Types) | 55 | self.types |
53 | } | 56 | } |
54 | 57 | ||
55 | pub fn take_values(self) -> Option<T> { | 58 | pub fn take_values(self) -> Option<T> { |
56 | self.take(Namespace::Values) | 59 | self.values |
57 | } | 60 | } |
58 | 61 | ||
59 | pub fn get(&self, namespace: Namespace) -> Option<&T> { | 62 | pub fn get_macros(&self) -> Option<MacroDef> { |
60 | self.as_ref().take(namespace) | 63 | self.macros |
64 | } | ||
65 | |||
66 | pub fn only_macros(&self) -> PerNs<T> { | ||
67 | PerNs { types: None, values: None, macros: self.macros } | ||
61 | } | 68 | } |
62 | 69 | ||
63 | pub fn as_ref(&self) -> PerNs<&T> { | 70 | pub fn as_ref(&self) -> PerNs<&T> { |
64 | PerNs { types: self.types.as_ref(), values: self.values.as_ref() } | 71 | PerNs { types: self.types.as_ref(), values: self.values.as_ref(), macros: self.macros } |
65 | } | 72 | } |
66 | 73 | ||
67 | pub fn or(self, other: PerNs<T>) -> PerNs<T> { | 74 | pub fn or(self, other: PerNs<T>) -> PerNs<T> { |
68 | PerNs { types: self.types.or(other.types), values: self.values.or(other.values) } | 75 | PerNs { |
76 | types: self.types.or(other.types), | ||
77 | values: self.values.or(other.values), | ||
78 | macros: self.macros.or(other.macros), | ||
79 | } | ||
69 | } | 80 | } |
70 | 81 | ||
71 | pub fn and_then<U>(self, f: impl Fn(T) -> Option<U>) -> PerNs<U> { | 82 | pub fn and_then<U>(self, f: impl Fn(T) -> Option<U>) -> PerNs<U> { |
72 | PerNs { types: self.types.and_then(&f), values: self.values.and_then(&f) } | 83 | PerNs { |
84 | types: self.types.and_then(&f), | ||
85 | values: self.values.and_then(&f), | ||
86 | macros: self.macros, | ||
87 | } | ||
73 | } | 88 | } |
74 | 89 | ||
75 | pub fn map<U>(self, f: impl Fn(T) -> U) -> PerNs<U> { | 90 | pub fn map<U>(self, f: impl Fn(T) -> U) -> PerNs<U> { |
76 | PerNs { types: self.types.map(&f), values: self.values.map(&f) } | 91 | PerNs { types: self.types.map(&f), values: self.values.map(&f), macros: self.macros } |
77 | } | 92 | } |
78 | } | 93 | } |