introduce known names

This commit is contained in:
Aleksey Kladov 2018-12-27 20:26:15 +03:00
parent d963042ca9
commit a9f55029b9
4 changed files with 71 additions and 29 deletions

View File

@ -38,7 +38,7 @@ use ra_db::{LocationIntener, SourceRootId, FileId, Cancelable};
use crate::{
db::HirDatabase,
arena::{Arena, Id},
name::AsName,
name::{AsName, KnownName},
};
pub use self::{

View File

@ -17,9 +17,25 @@ impl fmt::Display for Name {
}
impl Name {
// TODO: get rid of this?
pub(crate) fn as_str(&self) -> &str {
self.text.as_str()
pub(crate) fn as_known_name(&self) -> Option<KnownName> {
let name = match self.text.as_str() {
"isize" => KnownName::Isize,
"i8" => KnownName::I8,
"i16" => KnownName::I16,
"i32" => KnownName::I32,
"i64" => KnownName::I64,
"i128" => KnownName::I128,
"usize" => KnownName::Usize,
"u8" => KnownName::U8,
"u16" => KnownName::U16,
"u32" => KnownName::U32,
"u64" => KnownName::U64,
"u128" => KnownName::U128,
"f32" => KnownName::F32,
"f64" => KnownName::F64,
_ => return None,
};
Some(name)
}
#[cfg(not(test))]
@ -54,3 +70,28 @@ impl AsName for ra_db::Dependency {
Name::new(self.name.clone())
}
}
// Ideally, should be replaced with
// ```
// const ISIZE: Name = Name::new("isize")
// ```
// but const-fn is not that powerful yet.
#[derive(Debug)]
pub(crate) enum KnownName {
Isize,
I8,
I16,
I32,
I64,
I128,
Usize,
U8,
U16,
U32,
U64,
U128,
F32,
F64,
}

View File

@ -95,7 +95,7 @@ pub enum Ty {
Tuple(Vec<Ty>),
// The projection of an associated type. For example,
// `<T as Trait<..>>::N`.
// `<T as Trait<..>>::N`.pub
// Projection(ProjectionTy),
// Opaque (`impl Trait`) type found in a return type.
@ -180,12 +180,11 @@ impl Ty {
path: &Path,
) -> Cancelable<Self> {
if let Some(name) = path.as_ident() {
let name = name.as_str(); // :-(
if let Some(int_ty) = primitive::IntTy::from_string(name) {
if let Some(int_ty) = primitive::IntTy::from_name(name) {
return Ok(Ty::Int(int_ty));
} else if let Some(uint_ty) = primitive::UintTy::from_string(name) {
} else if let Some(uint_ty) = primitive::UintTy::from_name(name) {
return Ok(Ty::Uint(uint_ty));
} else if let Some(float_ty) = primitive::FloatTy::from_string(name) {
} else if let Some(float_ty) = primitive::FloatTy::from_name(name) {
return Ok(Ty::Float(float_ty));
}
}

View File

@ -1,5 +1,7 @@
use std::fmt;
use crate::{Name, KnownName};
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Copy)]
pub enum IntTy {
Isize,
@ -34,14 +36,14 @@ impl IntTy {
}
}
pub fn from_string(s: &str) -> Option<IntTy> {
match s {
"isize" => Some(IntTy::Isize),
"i8" => Some(IntTy::I8),
"i16" => Some(IntTy::I16),
"i32" => Some(IntTy::I32),
"i64" => Some(IntTy::I64),
"i128" => Some(IntTy::I128),
pub fn from_name(name: &Name) -> Option<IntTy> {
match name.as_known_name()? {
KnownName::Isize => Some(IntTy::Isize),
KnownName::I8 => Some(IntTy::I8),
KnownName::I16 => Some(IntTy::I16),
KnownName::I32 => Some(IntTy::I32),
KnownName::I64 => Some(IntTy::I64),
KnownName::I128 => Some(IntTy::I128),
_ => None,
}
}
@ -69,14 +71,14 @@ impl UintTy {
}
}
pub fn from_string(s: &str) -> Option<UintTy> {
match s {
"usize" => Some(UintTy::Usize),
"u8" => Some(UintTy::U8),
"u16" => Some(UintTy::U16),
"u32" => Some(UintTy::U32),
"u64" => Some(UintTy::U64),
"u128" => Some(UintTy::U128),
pub fn from_name(name: &Name) -> Option<UintTy> {
match name.as_known_name()? {
KnownName::Usize => Some(UintTy::Usize),
KnownName::U8 => Some(UintTy::U8),
KnownName::U16 => Some(UintTy::U16),
KnownName::U32 => Some(UintTy::U32),
KnownName::U64 => Some(UintTy::U64),
KnownName::U128 => Some(UintTy::U128),
_ => None,
}
}
@ -120,10 +122,10 @@ impl FloatTy {
}
}
pub fn from_string(s: &str) -> Option<FloatTy> {
match s {
"f32" => Some(FloatTy::F32),
"f64" => Some(FloatTy::F64),
pub fn from_name(name: &Name) -> Option<FloatTy> {
match name.as_known_name()? {
KnownName::F32 => Some(FloatTy::F32),
KnownName::F64 => Some(FloatTy::F64),
_ => None,
}
}