june_lang/
types.rs

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    // TODO: I don't think we need |typ| here
61    pub typ: Type,
62    pub reference: Reference,
63}