claw_ast/
types.rs

1use cranelift_entity::entity_impl;
2
3use super::{Component, NameId};
4
5#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
6pub struct TypeId(u32);
7entity_impl!(TypeId, "type");
8
9#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
10pub struct TypeDefId(u32);
11entity_impl!(TypeDefId, "typedef");
12
13/// The type for all values
14#[derive(Debug, Hash, Clone)]
15pub enum ValType {
16    Result(ResultType),
17    Primitive(PrimitiveType),
18}
19
20#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)]
21pub enum PrimitiveType {
22    // The boolean type
23    Bool,
24    // 8-bit Integers
25    U8,
26    S8,
27    // 16-bit Integers
28    U16,
29    S16,
30    // 32-bit Integers
31    U32,
32    S32,
33    // 64-bit Integers
34    U64,
35    S64,
36    // Floating Point Numbers
37    F32,
38    F64,
39    // String type
40    String,
41}
42
43#[derive(Debug, Hash, Clone)]
44pub struct ResultType {
45    pub ok: TypeId,
46    pub err: TypeId,
47}
48
49impl ValType {
50    pub fn eq(&self, other: &Self, comp: &Component) -> bool {
51        match (self, other) {
52            (ValType::Result(left), ValType::Result(right)) => {
53                let l_ok = comp.get_type(left.ok);
54                let r_ok = comp.get_type(right.ok);
55                let ok_eq = l_ok.eq(r_ok, comp);
56
57                let l_err = comp.get_type(left.err);
58                let r_err = comp.get_type(right.err);
59                let err_eq = l_err.eq(r_err, comp);
60
61                ok_eq && err_eq
62            }
63            (ValType::Primitive(left), ValType::Primitive(right)) => left == right,
64            _ => false,
65        }
66    }
67}
68
69#[derive(Debug, PartialEq, Eq, Hash, Clone)]
70pub enum TypeDefinition {
71    Record(RecordTypeDef),
72}
73
74#[derive(Debug, PartialEq, Eq, Hash, Clone)]
75pub struct RecordTypeDef {
76    fields: Vec<(NameId, TypeId)>,
77}
78
79#[derive(Debug, PartialEq, Eq, Hash, Clone)]
80pub struct FnType {
81    pub params: Vec<(NameId, TypeId)>,
82    pub results: Option<TypeId>,
83}