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)),
72 pub fn by_name(name: &Name) -> Option<Self> {
73 Self::ALL.iter().find_map(|(n, ty)| if n == name { Some(*ty) } else { None })
77 impl AsName for BuiltinType {
78 fn as_name(&self) -> Name {
80 BuiltinType::Char => name![char],
81 BuiltinType::Bool => name![bool],
82 BuiltinType::Str => name![str],
83 BuiltinType::Int(it) => match it {
84 BuiltinInt::Isize => name![isize],
85 BuiltinInt::I8 => name![i8],
86 BuiltinInt::I16 => name![i16],
87 BuiltinInt::I32 => name![i32],
88 BuiltinInt::I64 => name![i64],
89 BuiltinInt::I128 => name![i128],
91 BuiltinType::Uint(it) => match it {
92 BuiltinUint::Usize => name![usize],
93 BuiltinUint::U8 => name![u8],
94 BuiltinUint::U16 => name![u16],
95 BuiltinUint::U32 => name![u32],
96 BuiltinUint::U64 => name![u64],
97 BuiltinUint::U128 => name![u128],
99 BuiltinType::Float(it) => match it {
100 BuiltinFloat::F32 => name![f32],
101 BuiltinFloat::F64 => name![f64],
107 impl fmt::Display for BuiltinType {
108 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109 let type_name = self.as_name();
116 pub fn from_suffix(suffix: &str) -> Option<BuiltinInt> {
117 let res = match suffix {
118 "isize" => Self::Isize,
123 "i128" => Self::I128,
133 pub fn from_suffix(suffix: &str) -> Option<BuiltinUint> {
134 let res = match suffix {
135 "usize" => Self::Usize,
140 "u128" => Self::U128,
150 pub fn from_suffix(suffix: &str) -> Option<BuiltinFloat> {
151 let res = match suffix {
152 "f32" => BuiltinFloat::F32,
153 "f64" => BuiltinFloat::F64,
160 impl fmt::Display for BuiltinInt {
161 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
162 f.write_str(match self {
163 BuiltinInt::Isize => "isize",
164 BuiltinInt::I8 => "i8",
165 BuiltinInt::I16 => "i16",
166 BuiltinInt::I32 => "i32",
167 BuiltinInt::I64 => "i64",
168 BuiltinInt::I128 => "i128",
173 impl fmt::Display for BuiltinUint {
174 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
175 f.write_str(match self {
176 BuiltinUint::Usize => "usize",
177 BuiltinUint::U8 => "u8",
178 BuiltinUint::U16 => "u16",
179 BuiltinUint::U32 => "u32",
180 BuiltinUint::U64 => "u64",
181 BuiltinUint::U128 => "u128",
186 impl fmt::Display for BuiltinFloat {
187 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
188 f.write_str(match self {
189 BuiltinFloat::F32 => "f32",
190 BuiltinFloat::F64 => "f64",