1#[derive(Debug, PartialEq, Eq, Clone)]
2pub struct FnType {
3 pub index: usize,
4 pub params: Vec<Type>,
5 pub ret: Option<Box<Type>>,
6}
7
8#[derive(Debug, PartialEq, Eq, Clone)]
9pub struct FnDef {
10 pub typ: FnType,
11 pub locals: usize,
12}
13
14#[derive(Debug, PartialEq, Eq, Clone)]
15pub enum Type {
16 Void,
17 Int,
18 Str,
19 Fn(FnType),
20}
21
22impl From<Option<Box<Type>>> for Type {
23 fn from(value: Option<Box<Type>>) -> Self {
24 match value {
25 None => Type::Void,
26 Some(typ) => *typ,
27 }
28 }
29}
30
31impl Type {
32 pub fn as_fn(self) -> Option<FnType> {
33 if let Self::Fn(f) = self {
34 Some(f)
35 } else {
36 None
37 }
38 }
39}
40
41pub trait Typed {
42 fn typ(&self) -> Type;
43}
44
45#[derive(Debug, PartialEq, Eq, Clone)]
46pub enum Reference {
47 External,
48 Global { idx: usize },
49 Stack { local_idx: usize },
50}
51
52#[derive(Debug, PartialEq, Eq, Clone)]
53pub struct LocalBinding {
54 pub typ: Type,
55 pub idx: usize,
56}
57
58#[derive(Debug, PartialEq, Eq, Clone)]
59pub struct Resolution {
60 pub typ: Type,
62 pub reference: Reference,
63}