1use crate::ast::{
2 Expression, FunctionRefParam, Identifier, SeparatedListTrailing0, SeparatedListTrailing1,
3 StructDefinition,
4};
5use crate::token::Token;
6
7#[derive(Debug, Clone)]
21pub enum Type<'s> {
22 Local(LocalType<'s>),
23 Plain(PlainType<'s>),
24 Array(ArrayType<'s>),
25 Generic(GenericType<'s>),
26 FunctionRef(FunctionRefType<'s>),
27 Struct(StructType<'s>),
28 Reference(ReferenceType<'s>),
29 Nullable(NullableType<'s>),
30}
31
32#[derive(Debug, Clone)]
36pub struct LocalType<'s> {
37 pub local: &'s Token<'s>,
38}
39
40#[derive(Debug, Clone)]
44pub struct PlainType<'s> {
45 pub name: Identifier<'s>,
46}
47
48#[derive(Debug, Clone)]
52pub struct StructType<'s> {
53 pub struct_: &'s Token<'s>,
54 pub definition: StructDefinition<'s>,
55}
56
57#[derive(Debug, Clone)]
61pub struct ArrayType<'s> {
62 pub base: Box<Type<'s>>,
63 pub open: &'s Token<'s>,
64 pub len: Box<Expression<'s>>,
65 pub close: &'s Token<'s>,
66}
67
68#[derive(Debug, Clone)]
72pub struct GenericType<'s> {
73 pub base: Box<Type<'s>>,
74 pub open: &'s Token<'s>,
75 pub params: SeparatedListTrailing1<'s, Type<'s>>,
76 pub close: &'s Token<'s>,
77}
78
79#[derive(Debug, Clone)]
83pub struct FunctionRefType<'s> {
84 pub return_type: Option<Box<Type<'s>>>,
85 pub functionref: &'s Token<'s>,
86 pub open: &'s Token<'s>,
87 pub params: SeparatedListTrailing0<'s, FunctionRefParam<'s>>,
88 pub close: &'s Token<'s>,
89}
90
91#[derive(Debug, Clone)]
95pub struct ReferenceType<'s> {
96 pub base: Box<Type<'s>>,
97 pub reference: &'s Token<'s>,
98}
99
100#[derive(Debug, Clone)]
104pub struct NullableType<'s> {
105 pub base: Box<Type<'s>>,
106 pub ornull: &'s Token<'s>,
107}