aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_hir/src/lib.rs2
-rw-r--r--crates/ra_hir/src/name.rs47
-rw-r--r--crates/ra_hir/src/ty.rs9
-rw-r--r--crates/ra_hir/src/ty/primitive.rs42
4 files changed, 71 insertions, 29 deletions
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index bf43cd0ae..5bbb09c01 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -38,7 +38,7 @@ use ra_db::{LocationIntener, SourceRootId, FileId, Cancelable};
38use crate::{ 38use crate::{
39 db::HirDatabase, 39 db::HirDatabase,
40 arena::{Arena, Id}, 40 arena::{Arena, Id},
41 name::AsName, 41 name::{AsName, KnownName},
42}; 42};
43 43
44pub use self::{ 44pub use self::{
diff --git a/crates/ra_hir/src/name.rs b/crates/ra_hir/src/name.rs
index 7f42c9f04..cdad31be7 100644
--- a/crates/ra_hir/src/name.rs
+++ b/crates/ra_hir/src/name.rs
@@ -17,9 +17,25 @@ impl fmt::Display for Name {
17} 17}
18 18
19impl Name { 19impl Name {
20 // TODO: get rid of this? 20 pub(crate) fn as_known_name(&self) -> Option<KnownName> {
21 pub(crate) fn as_str(&self) -> &str { 21 let name = match self.text.as_str() {
22 self.text.as_str() 22 "isize" => KnownName::Isize,
23 "i8" => KnownName::I8,
24 "i16" => KnownName::I16,
25 "i32" => KnownName::I32,
26 "i64" => KnownName::I64,
27 "i128" => KnownName::I128,
28 "usize" => KnownName::Usize,
29 "u8" => KnownName::U8,
30 "u16" => KnownName::U16,
31 "u32" => KnownName::U32,
32 "u64" => KnownName::U64,
33 "u128" => KnownName::U128,
34 "f32" => KnownName::F32,
35 "f64" => KnownName::F64,
36 _ => return None,
37 };
38 Some(name)
23 } 39 }
24 40
25 #[cfg(not(test))] 41 #[cfg(not(test))]
@@ -54,3 +70,28 @@ impl AsName for ra_db::Dependency {
54 Name::new(self.name.clone()) 70 Name::new(self.name.clone())
55 } 71 }
56} 72}
73
74// Ideally, should be replaced with
75// ```
76// const ISIZE: Name = Name::new("isize")
77// ```
78// but const-fn is not that powerful yet.
79#[derive(Debug)]
80pub(crate) enum KnownName {
81 Isize,
82 I8,
83 I16,
84 I32,
85 I64,
86 I128,
87
88 Usize,
89 U8,
90 U16,
91 U32,
92 U64,
93 U128,
94
95 F32,
96 F64,
97}
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs
index dc3323b1a..ad097d1f1 100644
--- a/crates/ra_hir/src/ty.rs
+++ b/crates/ra_hir/src/ty.rs
@@ -95,7 +95,7 @@ pub enum Ty {
95 Tuple(Vec<Ty>), 95 Tuple(Vec<Ty>),
96 96
97 // The projection of an associated type. For example, 97 // The projection of an associated type. For example,
98 // `<T as Trait<..>>::N`. 98 // `<T as Trait<..>>::N`.pub
99 // Projection(ProjectionTy), 99 // Projection(ProjectionTy),
100 100
101 // Opaque (`impl Trait`) type found in a return type. 101 // Opaque (`impl Trait`) type found in a return type.
@@ -180,12 +180,11 @@ impl Ty {
180 path: &Path, 180 path: &Path,
181 ) -> Cancelable<Self> { 181 ) -> Cancelable<Self> {
182 if let Some(name) = path.as_ident() { 182 if let Some(name) = path.as_ident() {
183 let name = name.as_str(); // :-( 183 if let Some(int_ty) = primitive::IntTy::from_name(name) {
184 if let Some(int_ty) = primitive::IntTy::from_string(name) {
185 return Ok(Ty::Int(int_ty)); 184 return Ok(Ty::Int(int_ty));
186 } else if let Some(uint_ty) = primitive::UintTy::from_string(name) { 185 } else if let Some(uint_ty) = primitive::UintTy::from_name(name) {
187 return Ok(Ty::Uint(uint_ty)); 186 return Ok(Ty::Uint(uint_ty));
188 } else if let Some(float_ty) = primitive::FloatTy::from_string(name) { 187 } else if let Some(float_ty) = primitive::FloatTy::from_name(name) {
189 return Ok(Ty::Float(float_ty)); 188 return Ok(Ty::Float(float_ty));
190 } 189 }
191 } 190 }
diff --git a/crates/ra_hir/src/ty/primitive.rs b/crates/ra_hir/src/ty/primitive.rs
index ad79b17e4..498d42d52 100644
--- a/crates/ra_hir/src/ty/primitive.rs
+++ b/crates/ra_hir/src/ty/primitive.rs
@@ -1,5 +1,7 @@
1use std::fmt; 1use std::fmt;
2 2
3use crate::{Name, KnownName};
4
3#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Copy)] 5#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Copy)]
4pub enum IntTy { 6pub enum IntTy {
5 Isize, 7 Isize,
@@ -34,14 +36,14 @@ impl IntTy {
34 } 36 }
35 } 37 }
36 38
37 pub fn from_string(s: &str) -> Option<IntTy> { 39 pub fn from_name(name: &Name) -> Option<IntTy> {
38 match s { 40 match name.as_known_name()? {
39 "isize" => Some(IntTy::Isize), 41 KnownName::Isize => Some(IntTy::Isize),
40 "i8" => Some(IntTy::I8), 42 KnownName::I8 => Some(IntTy::I8),
41 "i16" => Some(IntTy::I16), 43 KnownName::I16 => Some(IntTy::I16),
42 "i32" => Some(IntTy::I32), 44 KnownName::I32 => Some(IntTy::I32),
43 "i64" => Some(IntTy::I64), 45 KnownName::I64 => Some(IntTy::I64),
44 "i128" => Some(IntTy::I128), 46 KnownName::I128 => Some(IntTy::I128),
45 _ => None, 47 _ => None,
46 } 48 }
47 } 49 }
@@ -69,14 +71,14 @@ impl UintTy {
69 } 71 }
70 } 72 }
71 73
72 pub fn from_string(s: &str) -> Option<UintTy> { 74 pub fn from_name(name: &Name) -> Option<UintTy> {
73 match s { 75 match name.as_known_name()? {
74 "usize" => Some(UintTy::Usize), 76 KnownName::Usize => Some(UintTy::Usize),
75 "u8" => Some(UintTy::U8), 77 KnownName::U8 => Some(UintTy::U8),
76 "u16" => Some(UintTy::U16), 78 KnownName::U16 => Some(UintTy::U16),
77 "u32" => Some(UintTy::U32), 79 KnownName::U32 => Some(UintTy::U32),
78 "u64" => Some(UintTy::U64), 80 KnownName::U64 => Some(UintTy::U64),
79 "u128" => Some(UintTy::U128), 81 KnownName::U128 => Some(UintTy::U128),
80 _ => None, 82 _ => None,
81 } 83 }
82 } 84 }
@@ -120,10 +122,10 @@ impl FloatTy {
120 } 122 }
121 } 123 }
122 124
123 pub fn from_string(s: &str) -> Option<FloatTy> { 125 pub fn from_name(name: &Name) -> Option<FloatTy> {
124 match s { 126 match name.as_known_name()? {
125 "f32" => Some(FloatTy::F32), 127 KnownName::F32 => Some(FloatTy::F32),
126 "f64" => Some(FloatTy::F64), 128 KnownName::F64 => Some(FloatTy::F64),
127 _ => None, 129 _ => None,
128 } 130 }
129 } 131 }