aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/name.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/name.rs')
-rw-r--r--crates/ra_hir/src/name.rs105
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 @@
1use std::fmt;
2
3use 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)]
9pub struct Name {
10 text: SmolStr,
11}
12
13impl fmt::Display for Name {
14 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
15 fmt::Display::fmt(&self.text, f)
16 }
17}
18
19impl fmt::Debug for Name {
20 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
21 fmt::Debug::fmt(&self.text, f)
22 }
23}
24
25impl 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
60pub(crate) trait AsName {
61 fn as_name(&self) -> Name;
62}
63
64impl AsName for ast::NameRef<'_> {
65 fn as_name(&self) -> Name {
66 Name::new(self.text())
67 }
68}
69
70impl AsName for ast::Name<'_> {
71 fn as_name(&self) -> Name {
72 Name::new(self.text())
73 }
74}
75
76impl 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)]
88pub(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}