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#[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 Bool,
24 U8,
26 S8,
27 U16,
29 S16,
30 U32,
32 S32,
33 U64,
35 S64,
36 F32,
38 F64,
39 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}