diff options
Diffstat (limited to 'crates/ra_hir/src/name.rs')
-rw-r--r-- | crates/ra_hir/src/name.rs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/crates/ra_hir/src/name.rs b/crates/ra_hir/src/name.rs new file mode 100644 index 000000000..51e8b3da8 --- /dev/null +++ b/crates/ra_hir/src/name.rs | |||
@@ -0,0 +1,105 @@ | |||
1 | use std::fmt; | ||
2 | |||
3 | use ra_syntax::{ast, SmolStr}; | ||
4 | |||
5 | /// `Name` is a wrapper around string, which is used in hir for both references | ||
6 | /// and declarations. In theory, names should also carry hygene info, but we are | ||
7 | /// not there yet! | ||
8 | #[derive(Clone, PartialEq, Eq, Hash)] | ||
9 | pub struct Name { | ||
10 | text: SmolStr, | ||
11 | } | ||
12 | |||
13 | impl fmt::Display for Name { | ||
14 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
15 | fmt::Display::fmt(&self.text, f) | ||
16 | } | ||
17 | } | ||
18 | |||
19 | impl fmt::Debug for Name { | ||
20 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
21 | fmt::Debug::fmt(&self.text, f) | ||
22 | } | ||
23 | } | ||
24 | |||
25 | impl Name { | ||
26 | fn new(text: SmolStr) -> Name { | ||
27 | Name { text } | ||
28 | } | ||
29 | |||
30 | pub(crate) fn missing() -> Name { | ||
31 | Name::new("[missing name]".into()) | ||
32 | } | ||
33 | |||
34 | pub(crate) fn tuple_field_name(idx: usize) -> Name { | ||
35 | Name::new(idx.to_string().into()) | ||
36 | } | ||
37 | |||
38 | pub(crate) fn as_known_name(&self) -> Option<KnownName> { | ||
39 | let name = match self.text.as_str() { | ||
40 | "isize" => KnownName::Isize, | ||
41 | "i8" => KnownName::I8, | ||
42 | "i16" => KnownName::I16, | ||
43 | "i32" => KnownName::I32, | ||
44 | "i64" => KnownName::I64, | ||
45 | "i128" => KnownName::I128, | ||
46 | "usize" => KnownName::Usize, | ||
47 | "u8" => KnownName::U8, | ||
48 | "u16" => KnownName::U16, | ||
49 | "u32" => KnownName::U32, | ||
50 | "u64" => KnownName::U64, | ||
51 | "u128" => KnownName::U128, | ||
52 | "f32" => KnownName::F32, | ||
53 | "f64" => KnownName::F64, | ||
54 | _ => return None, | ||
55 | }; | ||
56 | Some(name) | ||
57 | } | ||
58 | } | ||
59 | |||
60 | pub(crate) trait AsName { | ||
61 | fn as_name(&self) -> Name; | ||
62 | } | ||
63 | |||
64 | impl AsName for ast::NameRef<'_> { | ||
65 | fn as_name(&self) -> Name { | ||
66 | Name::new(self.text()) | ||
67 | } | ||
68 | } | ||
69 | |||
70 | impl AsName for ast::Name<'_> { | ||
71 | fn as_name(&self) -> Name { | ||
72 | Name::new(self.text()) | ||
73 | } | ||
74 | } | ||
75 | |||
76 | impl AsName for ra_db::Dependency { | ||
77 | fn as_name(&self) -> Name { | ||
78 | Name::new(self.name.clone()) | ||
79 | } | ||
80 | } | ||
81 | |||
82 | // Ideally, should be replaced with | ||
83 | // ``` | ||
84 | // const ISIZE: Name = Name::new("isize") | ||
85 | // ``` | ||
86 | // but const-fn is not that powerful yet. | ||
87 | #[derive(Debug)] | ||
88 | pub(crate) enum KnownName { | ||
89 | Isize, | ||
90 | I8, | ||
91 | I16, | ||
92 | I32, | ||
93 | I64, | ||
94 | I128, | ||
95 | |||
96 | Usize, | ||
97 | U8, | ||
98 | U16, | ||
99 | U32, | ||
100 | U64, | ||
101 | U128, | ||
102 | |||
103 | F32, | ||
104 | F64, | ||
105 | } | ||