diff options
Diffstat (limited to 'crates/ra_hir_def/src/nameres/per_ns.rs')
-rw-r--r-- | crates/ra_hir_def/src/nameres/per_ns.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/crates/ra_hir_def/src/nameres/per_ns.rs b/crates/ra_hir_def/src/nameres/per_ns.rs new file mode 100644 index 000000000..298b0b0c7 --- /dev/null +++ b/crates/ra_hir_def/src/nameres/per_ns.rs | |||
@@ -0,0 +1,82 @@ | |||
1 | //! FIXME: write short doc here | ||
2 | |||
3 | use hir_expand::MacroDefId; | ||
4 | |||
5 | use crate::ModuleDefId; | ||
6 | |||
7 | #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] | ||
8 | pub enum Namespace { | ||
9 | Types, | ||
10 | Values, | ||
11 | // Note that only type inference uses this enum, and it doesn't care about macros. | ||
12 | // Macro, | ||
13 | } | ||
14 | |||
15 | #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] | ||
16 | pub struct PerNs { | ||
17 | pub types: Option<ModuleDefId>, | ||
18 | pub values: Option<ModuleDefId>, | ||
19 | /// Since macros has different type, many methods simply ignore it. | ||
20 | /// We can only use special method like `get_macros` to access it. | ||
21 | pub macros: Option<MacroDefId>, | ||
22 | } | ||
23 | |||
24 | impl Default for PerNs { | ||
25 | fn default() -> Self { | ||
26 | PerNs { types: None, values: None, macros: None } | ||
27 | } | ||
28 | } | ||
29 | |||
30 | impl PerNs { | ||
31 | pub fn none() -> PerNs { | ||
32 | PerNs { types: None, values: None, macros: None } | ||
33 | } | ||
34 | |||
35 | pub fn values(t: ModuleDefId) -> PerNs { | ||
36 | PerNs { types: None, values: Some(t), macros: None } | ||
37 | } | ||
38 | |||
39 | pub fn types(t: ModuleDefId) -> PerNs { | ||
40 | PerNs { types: Some(t), values: None, macros: None } | ||
41 | } | ||
42 | |||
43 | pub fn both(types: ModuleDefId, values: ModuleDefId) -> PerNs { | ||
44 | PerNs { types: Some(types), values: Some(values), macros: None } | ||
45 | } | ||
46 | |||
47 | pub fn macros(macro_: MacroDefId) -> PerNs { | ||
48 | PerNs { types: None, values: None, macros: Some(macro_) } | ||
49 | } | ||
50 | |||
51 | pub fn is_none(&self) -> bool { | ||
52 | self.types.is_none() && self.values.is_none() && self.macros.is_none() | ||
53 | } | ||
54 | |||
55 | pub fn is_all(&self) -> bool { | ||
56 | self.types.is_some() && self.values.is_some() && self.macros.is_some() | ||
57 | } | ||
58 | |||
59 | pub fn take_types(self) -> Option<ModuleDefId> { | ||
60 | self.types | ||
61 | } | ||
62 | |||
63 | pub fn take_values(self) -> Option<ModuleDefId> { | ||
64 | self.values | ||
65 | } | ||
66 | |||
67 | pub fn get_macros(&self) -> Option<MacroDefId> { | ||
68 | self.macros | ||
69 | } | ||
70 | |||
71 | pub fn only_macros(&self) -> PerNs { | ||
72 | PerNs { types: None, values: None, macros: self.macros } | ||
73 | } | ||
74 | |||
75 | pub fn or(self, other: PerNs) -> PerNs { | ||
76 | PerNs { | ||
77 | types: self.types.or(other.types), | ||
78 | values: self.values.or(other.values), | ||
79 | macros: self.macros.or(other.macros), | ||
80 | } | ||
81 | } | ||
82 | } | ||