1use nash_region::{Located, Region};
2
3#[derive(Debug)]
4pub struct Module<'a> {
5 pub name: Option<&'a Located<&'a str>>,
6 pub exports: &'a Located<Exposing<'a>>,
7 pub docs: &'a Docs<'a>,
8 pub imports: &'a [&'a Import<'a>],
9 pub values: &'a [&'a Located<Value<'a>>],
10 pub unions: &'a [&'a Located<Union<'a>>],
11 pub aliases: &'a [&'a Located<Alias<'a>>],
12 pub binops: &'a [&'a Located<Infix<'a>>],
13}
14
15#[derive(Debug)]
16pub struct Import<'a> {
17 pub import: &'a Located<&'a str>,
18 pub alias: Option<&'a str>,
19 pub exposing: &'a Exposing<'a>,
20}
21
22#[derive(Debug)]
23pub struct Value<'a> {
24 pub name: &'a Located<&'a str>,
25 pub arguments: &'a [&'a Located<Pattern<'a>>],
26 pub body: &'a Located<Expr<'a>>,
27 pub annotation: Option<&'a Located<Type<'a>>>,
28}
29
30#[derive(Debug)]
34pub struct Union<'a> {
35 pub name: &'a Located<&'a str>,
36 pub arguments: &'a [&'a Located<&'a str>],
38 pub ctors: &'a [&'a Ctor<'a>],
39}
40
41#[derive(Debug)]
42pub struct Ctor<'a> {
43 pub name: &'a Located<&'a str>,
44 pub arguments: &'a [&'a Located<Type<'a>>],
45}
46
47#[derive(Debug)]
48pub struct Alias<'a> {
49 pub name: &'a Located<&'a str>,
50 pub arguments: &'a [&'a Located<&'a str>],
52 pub typ: &'a Located<Type<'a>>,
53}
54
55#[derive(Debug)]
56pub struct Infix<'a> {
57 pub op: &'a str,
58 pub associativity: Associativity,
59 pub precedence: Precedence,
60 pub name: &'a str,
61}
62
63#[derive(Debug, PartialEq, Eq)]
64pub enum Associativity {
65 Left,
66 None,
67 Right,
68}
69
70#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
71pub struct Precedence(pub u16);
72
73#[derive(Debug)]
74pub enum Expr<'a> {
75 Str(&'a str),
76 Int(i128),
77 Var {
78 kind: VarType,
79 name: &'a str,
80 },
81 VarQual {
82 kind: VarType,
83 module: &'a str,
84 name: &'a str,
85 },
86 List(&'a [&'a Located<Expr<'a>>]),
87 Op(&'a str),
88 Negate(&'a Located<Expr<'a>>),
89 BinOps {
90 operands: &'a [&'a BinOpOperand<'a>],
91 last: &'a Located<Expr<'a>>,
92 },
93 Lambda {
94 parameters: &'a [&'a Located<Pattern<'a>>],
95 body: &'a Located<Expr<'a>>,
96 },
97 Call {
98 function: &'a Located<Expr<'a>>,
99 arguments: &'a [&'a Located<Expr<'a>>],
100 },
101 If {
102 branches: &'a [&'a IfBranch<'a>],
103 final_else: &'a Located<Expr<'a>>,
104 },
105 Let {
106 defs: &'a [&'a Located<Def<'a>>],
107 body: &'a Located<Expr<'a>>,
108 },
109 Case {
110 scrutinee: &'a Located<Expr<'a>>,
111 arms: &'a [&'a CaseArm<'a>],
112 },
113 Accessor(&'a str),
114 Access {
115 record: &'a Located<Expr<'a>>,
116 field: &'a Located<&'a str>,
117 },
118 Update {
119 record: &'a Located<&'a str>,
120 fields: &'a [&'a FieldAssign<'a>],
121 },
122 Record(&'a [&'a FieldAssign<'a>]),
123 Unit,
124 Tuple {
125 first: &'a Located<Expr<'a>>,
126 second: &'a Located<Expr<'a>>,
127 rest: &'a [&'a Located<Expr<'a>>],
128 },
129}
130
131#[derive(Debug)]
132pub enum VarType {
133 LowVar,
134 CapVar,
135}
136
137#[derive(Debug)]
138pub struct IfBranch<'a> {
139 pub condition: &'a Located<Expr<'a>>,
140 pub then_branch: &'a Located<Expr<'a>>,
141}
142
143#[derive(Debug)]
145pub struct BinOpOperand<'a> {
146 pub expr: &'a Located<Expr<'a>>,
147 pub op: &'a Located<&'a str>,
148}
149
150#[derive(Debug)]
151pub enum Def<'a> {
152 Define {
153 name: &'a Located<&'a str>,
154 args: &'a [&'a Located<Pattern<'a>>],
155 body: &'a Located<Expr<'a>>,
156 annotation: Option<&'a Located<Type<'a>>>,
157 },
158 Destruct {
159 pattern: &'a Located<Pattern<'a>>,
160 body: &'a Located<Expr<'a>>,
161 },
162}
163
164#[derive(Debug)]
165pub struct CaseArm<'a> {
166 pub pattern: &'a Located<Pattern<'a>>,
167 pub body: &'a Located<Expr<'a>>,
168}
169
170#[derive(Debug)]
171pub struct FieldAssign<'a> {
172 pub field: &'a Located<&'a str>,
173 pub value: &'a Located<Expr<'a>>,
174}
175
176#[derive(Debug)]
177pub enum Pattern<'a> {
178 Anything,
179 Var(&'a str),
180 Record(&'a [&'a Located<&'a str>]),
181 Alias {
182 pattern: &'a Located<Pattern<'a>>,
183 name: &'a Located<&'a str>,
184 },
185 Unit,
186 Tuple {
187 first: &'a Located<Pattern<'a>>,
188 second: &'a Located<Pattern<'a>>,
189 rest: &'a [&'a Located<Pattern<'a>>],
190 },
191 Ctor {
192 region: Region,
193 name: &'a str,
194 args: &'a [&'a Located<Pattern<'a>>],
195 },
196 CtorQual {
197 region: Region,
198 module: &'a str,
199 name: &'a str,
200 args: &'a [&'a Located<Pattern<'a>>],
201 },
202 List(&'a [&'a Located<Pattern<'a>>]),
203 Cons {
204 head: &'a Located<Pattern<'a>>,
205 tail: &'a Located<Pattern<'a>>,
206 },
207 Str(&'a str),
208 Int(i128),
209}
210
211#[derive(Debug)]
212pub enum Type<'a> {
213 Lambda {
214 from: &'a Located<Type<'a>>,
215 to: &'a Located<Type<'a>>,
216 },
217 Var(&'a str),
218 Type {
219 region: Region,
220 name: &'a str,
221 args: &'a [&'a Located<Type<'a>>],
222 },
223 TypeQual {
224 region: Region,
225 module: &'a str,
226 name: &'a str,
227 args: &'a [&'a Located<Type<'a>>],
228 },
229 Record {
230 fields: &'a [&'a FieldType<'a>],
231 ext: Option<&'a Located<&'a str>>,
232 },
233 Unit,
234 Tuple {
235 first: &'a Located<Type<'a>>,
236 second: &'a Located<Type<'a>>,
237 rest: &'a [&'a Located<Type<'a>>],
238 },
239}
240
241#[derive(Debug)]
242pub struct FieldType<'a> {
243 pub field: &'a Located<&'a str>,
244 pub typ: &'a Located<Type<'a>>,
245}
246
247#[derive(Debug)]
248pub enum Docs<'a> {
249 NoDocs(Region),
250 YesDocs {
251 overview: &'a Comment<'a>,
252 comments: &'a [&'a (&'a str, &'a Comment<'a>)],
253 },
254}
255
256#[derive(Debug)]
257pub struct Comment<'a>(pub &'a Snippet<'a>);
258
259#[derive(Debug)]
260pub struct Snippet<'a> {
261 pub data: &'a [u8], pub off_row: u16,
265 pub off_col: u16,
266}
267
268#[derive(Debug)]
269pub enum Exposing<'a> {
270 Open,
271 Explicit(&'a [&'a Exposed<'a>]),
272}
273
274#[derive(Debug)]
275pub enum Exposed<'a> {
276 Lower(&'a Located<&'a str>),
277 Upper {
278 name: &'a Located<&'a str>,
279 privacy: Privacy,
280 },
281 Operator {
282 region: Region,
283 op: &'a str,
284 },
285}
286
287#[derive(Debug)]
288pub enum Privacy {
289 Public(Region),
290 Private,
291}