1use crate::handle::Handle;
4use cl_ast::types::Symbol;
5use std::{fmt::Debug, str::FromStr};
6
7mod display;
8
9#[derive(Clone, Debug, PartialEq, Eq, Hash)]
12pub enum TypeKind {
13 Inferred,
15 Variable,
17 Instance(Handle),
19 Primitive(Primitive),
21 Adt(Adt),
23 Ref(Handle),
25 Ptr(Handle),
27 Slice(Handle),
29 Array(Handle, usize),
31 Tuple(Vec<Handle>),
33 FnSig { args: Handle, rety: Handle },
35 Module,
37}
38
39#[derive(Clone, Debug, PartialEq, Eq, Hash)]
40pub enum Visibility {
41 Public,
42 Private,
43}
44
45#[derive(Clone, Debug, PartialEq, Eq, Hash)]
47pub enum Adt {
48 Enum(Vec<(Symbol, Handle)>),
50
51 Struct(Vec<(Symbol, Visibility, Handle)>),
53 TupleStruct(Vec<(Visibility, Handle)>),
55 UnitStruct,
57
58 Union(Vec<(Symbol, Handle)>),
61}
62
63#[rustfmt::skip]
66#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
67pub enum Primitive {
68 I8, I16, I32, I64, I128, Isize, U8, U16, U32, U64, U128, Usize, F8, F16, F32, F64, F128, Fsize, Integer, Float, Bool, Char, Str, Never, }
77
78#[rustfmt::skip]
79impl Primitive {
80 pub fn is_integer(self) -> bool {
82 matches!(
83 self,
84 | Self::I8 | Self::I16 | Self::I32 | Self::I64 | Self::I128 | Self::Isize
85 | Self::U8 | Self::U16 | Self::U32 | Self::U64 | Self::U128 | Self::Usize
86 | Self::Integer
87 )
88 }
89 pub fn is_float(self) -> bool {
91 matches!(
92 self,
93 | Self::F8 | Self::F16 | Self::F32 | Self::F64 | Self::F128 | Self::Fsize
94 | Self::Float
95 )
96 }
97}
98
99impl FromStr for Primitive {
102 type Err = ();
103
104 fn from_str(s: &str) -> Result<Self, Self::Err> {
105 Ok(match s {
106 "i8" => Primitive::I8,
107 "i16" => Primitive::I16,
108 "i32" => Primitive::I32,
109 "i64" => Primitive::I64,
110 "i128" => Primitive::I128,
111 "isize" => Primitive::Isize,
112 "u8" => Primitive::U8,
113 "u16" => Primitive::U16,
114 "u32" => Primitive::U32,
115 "u64" => Primitive::U64,
116 "u128" => Primitive::U128,
117 "usize" => Primitive::Usize,
118 "f8" => Primitive::F8,
119 "f16" => Primitive::F16,
120 "f32" => Primitive::F32,
121 "f64" => Primitive::F64,
122 "f128" => Primitive::F128,
123 "fsize" => Primitive::Fsize,
124 "bool" => Primitive::Bool,
125 "char" => Primitive::Char,
126 "str" => Primitive::Str,
127 "never" => Primitive::Never,
128 _ => Err(())?,
129 })
130 }
131}