1 //! This module defines built-in types.
3 //! A peculiarity of built-in types is that they are always available and are
4 //! not associated with any particular crate.
8 use hir_expand::name::{name, AsName, Name};
9 /// Different signed int types.
10 #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
20 /// Different unsigned int types.
21 #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
22 pub enum BuiltinUint {
31 #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
32 pub enum BuiltinFloat {
37 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
38 pub enum BuiltinType {
49 pub const ALL: &'static [(Name, BuiltinType)] = &[
50 (name![char], BuiltinType::Char),
51 (name![bool], BuiltinType::Bool),
52 (name![str], BuiltinType::Str),
54 (name![isize], BuiltinType::Int(BuiltinInt::Isize)),
55 (name![i8], BuiltinType::Int(BuiltinInt::I8)),
56 (name![i16], BuiltinType::Int(BuiltinInt::I16)),
57 (name![i32], BuiltinType::Int(BuiltinInt::I32)),
58 (name![i64], BuiltinType::Int(BuiltinInt::I64)),
59 (name![i128], BuiltinType::Int(BuiltinInt::I128)),
61 (name![usize], BuiltinType::Uint(BuiltinUint::Usize)),
62 (name![u8], BuiltinType::Uint(BuiltinUint::U8)),
63 (name![u16], BuiltinType::Uint(BuiltinUint::U16)),
64 (name![u32], BuiltinType::Uint(BuiltinUint::U32)),
65 (name![u64], BuiltinType::Uint(BuiltinUint::U64)),
66 (name![u128], BuiltinType::Uint(BuiltinUint::U128)),
68 (name![f32], BuiltinType::Float(BuiltinFloat::F32)),
69 (name![f64], BuiltinType::Float(BuiltinFloat::F64)),
73 impl AsName for BuiltinType {
74 fn as_name(&self) -> Name {
76 BuiltinType::Char => name![char],
77 BuiltinType::Bool => name![bool],
78 BuiltinType::Str => name![str],
79 BuiltinType::Int(it) => match it {
80 BuiltinInt::Isize => name![isize],
81 BuiltinInt::I8 => name![i8],
82 BuiltinInt::I16 => name![i16],
83 BuiltinInt::I32 => name![i32],
84 BuiltinInt::I64 => name![i64],
85 BuiltinInt::I128 => name![i128],
87 BuiltinType::Uint(it) => match it {
88 BuiltinUint::Usize => name![usize],
89 BuiltinUint::U8 => name![u8],
90 BuiltinUint::U16 => name![u16],
91 BuiltinUint::U32 => name![u32],
92 BuiltinUint::U64 => name![u64],
93 BuiltinUint::U128 => name![u128],
95 BuiltinType::Float(it) => match it {
96 BuiltinFloat::F32 => name![f32],
97 BuiltinFloat::F64 => name![f64],
103 impl fmt::Display for BuiltinType {
104 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
105 let type_name = self.as_name();
112 pub fn from_suffix(suffix: &str) -> Option<BuiltinInt> {
113 let res = match suffix {
114 "isize" => Self::Isize,
119 "i128" => Self::I128,
129 pub fn from_suffix(suffix: &str) -> Option<BuiltinUint> {
130 let res = match suffix {
131 "usize" => Self::Usize,
136 "u128" => Self::U128,
146 pub fn from_suffix(suffix: &str) -> Option<BuiltinFloat> {
147 let res = match suffix {
148 "f32" => BuiltinFloat::F32,
149 "f64" => BuiltinFloat::F64,