Skip to main content

nash_source/
lib.rs

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// type Maybe a
31//   = Just a
32//   | Nothing
33#[derive(Debug)]
34pub struct Union<'a> {
35    pub name: &'a Located<&'a str>,
36    // type vars
37    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    // type vars
51    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/// An operand in a binary operator chain: expression followed by operator.
144#[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], // already the relevant slice
262    // offset: usize,
263    // length: usize,
264    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}