Fork of daniellemaywood.uk/gleam — Wasm codegen work
3.2 kB
197 lines
1use ecow::EcoString;
2use num_bigint::BigInt;
3
4#[derive(Debug, PartialEq, Eq, Default)]
5pub struct Module {
6 pub functions: Vec<Function>,
7}
8
9#[derive(Debug, PartialEq, Eq)]
10pub struct Function {
11 pub name: EcoString,
12 pub return_type: Type,
13 pub parameters: Vec<FunctionParameter>,
14 pub body: Expression,
15}
16
17#[derive(Debug, PartialEq, Eq)]
18pub struct FunctionParameter {
19 pub type_: Type,
20 pub name: Option<EcoString>,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq)]
24pub enum Type {
25 Int,
26 Float,
27 Bool,
28 String,
29 Struct { elements: Vec<Type> },
30 List(Box<Type>),
31 Generic,
32}
33
34#[derive(Debug, PartialEq, Eq, Clone)]
35pub struct Var {
36 pub name: EcoString,
37}
38
39#[derive(Debug, PartialEq, Eq, Clone)]
40pub enum Expression {
41 Block(Vec<Expression>),
42
43 FunctionRef {
44 module: EcoString,
45 name: EcoString,
46 arity: usize,
47 },
48
49 Var(Var),
50
51 Int {
52 value: BigInt,
53 },
54
55 Float {
56 value: EcoString,
57 },
58
59 Bool {
60 value: bool,
61 },
62
63 String {
64 value: EcoString,
65 },
66
67 Equals {
68 lhs: Box<Expression>,
69 rhs: Box<Expression>,
70 },
71
72 NotEquals {
73 lhs: Box<Expression>,
74 rhs: Box<Expression>,
75 },
76
77 IntGt {
78 lhs: Box<Expression>,
79 rhs: Box<Expression>,
80 },
81
82 IntGtEq {
83 lhs: Box<Expression>,
84 rhs: Box<Expression>,
85 },
86
87 IntLt {
88 lhs: Box<Expression>,
89 rhs: Box<Expression>,
90 },
91
92 IntLtEq {
93 lhs: Box<Expression>,
94 rhs: Box<Expression>,
95 },
96
97 IntAdd {
98 lhs: Box<Expression>,
99 rhs: Box<Expression>,
100 },
101
102 IntSub {
103 lhs: Box<Expression>,
104 rhs: Box<Expression>,
105 },
106
107 IntMul {
108 lhs: Box<Expression>,
109 rhs: Box<Expression>,
110 },
111
112 IntDiv {
113 lhs: Box<Expression>,
114 rhs: Box<Expression>,
115 },
116
117 IntRem {
118 lhs: Box<Expression>,
119 rhs: Box<Expression>,
120 },
121
122 FloatGt {
123 lhs: Box<Expression>,
124 rhs: Box<Expression>,
125 },
126
127 FloatGtEq {
128 lhs: Box<Expression>,
129 rhs: Box<Expression>,
130 },
131
132 FloatLt {
133 lhs: Box<Expression>,
134 rhs: Box<Expression>,
135 },
136
137 FloatLtEq {
138 lhs: Box<Expression>,
139 rhs: Box<Expression>,
140 },
141
142 FloatAdd {
143 lhs: Box<Expression>,
144 rhs: Box<Expression>,
145 },
146
147 FloatSub {
148 lhs: Box<Expression>,
149 rhs: Box<Expression>,
150 },
151
152 FloatMul {
153 lhs: Box<Expression>,
154 rhs: Box<Expression>,
155 },
156
157 FloatDiv {
158 lhs: Box<Expression>,
159 rhs: Box<Expression>,
160 },
161
162 StringConcat {
163 lhs: Box<Expression>,
164 rhs: Box<Expression>,
165 },
166
167 List {
168 items: Vec<Expression>,
169 tail: Option<Box<Expression>>,
170 },
171
172 Struct {
173 tag: Option<u32>,
174 items: Vec<Expression>,
175 },
176
177 StructAccess {
178 value: Box<Expression>,
179 index: u64,
180 },
181
182 Set {
183 name: Var,
184 value: Box<Expression>,
185 },
186
187 If {
188 cond: Box<Expression>,
189 then: Box<Expression>,
190 else_: Box<Expression>,
191 },
192
193 Call {
194 target: Box<Expression>,
195 args: Vec<Expression>,
196 },
197}