aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/nameres/per_ns.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def/src/nameres/per_ns.rs')
-rw-r--r--crates/ra_hir_def/src/nameres/per_ns.rs82
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
3use hir_expand::MacroDefId;
4
5use crate::ModuleDefId;
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub 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)]
16pub 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
24impl Default for PerNs {
25 fn default() -> Self {
26 PerNs { types: None, values: None, macros: None }
27 }
28}
29
30impl 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}