1#![doc = include_str!("readme.md")]
2use core::range::Range;
3use std::{boxed::Box, string::String, vec::Vec};
4
5use crate::lexer::token_type::ErlangTokenType;
6
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Debug, PartialEq, Clone)]
10pub struct ErlangRoot {
11 pub items: Vec<Item>,
13}
14
15#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[derive(Debug, PartialEq, Eq, Clone)]
18pub struct Identifier {
19 pub name: String,
21 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
23 pub span: Range<usize>,
24}
25
26#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
28#[derive(Debug, PartialEq, Clone)]
29pub enum Item {
30 Module(Module),
32 Function(Function),
34 Attribute(Attribute),
36 Export(Export),
38}
39
40#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
42#[derive(Debug, PartialEq, Clone)]
43pub struct Module {
44 pub name: Identifier,
46 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
48 pub span: Range<usize>,
49}
50
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
53#[derive(Debug, PartialEq, Clone)]
54pub struct Export {
55 pub functions: Vec<Identifier>,
57 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
59 pub span: Range<usize>,
60}
61
62#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
64#[derive(Debug, PartialEq, Clone)]
65pub struct Attribute {
66 pub name: Identifier,
68 pub value: String,
70 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
72 pub span: Range<usize>,
73}
74
75#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
77#[derive(Debug, PartialEq, Clone)]
78pub struct Function {
79 pub name: Identifier,
81 pub arity: usize,
83 pub clauses: Vec<FunctionClause>,
85 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
87 pub span: Range<usize>,
88}
89
90#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
92#[derive(Debug, PartialEq, Clone)]
93pub struct FunctionClause {
94 pub patterns: Vec<Pattern>,
96 pub guard: Option<Expr>,
98 pub body: Vec<Statement>,
100 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
102 pub span: Range<usize>,
103}
104
105#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
107#[derive(Debug, PartialEq, Clone)]
108pub enum Pattern {
109 Variable(Identifier),
111 Atom(String),
113 Number(String),
115 String(String),
117 List(Vec<Pattern>),
119 Tuple(Vec<Pattern>),
121 Record(RecordPattern),
123 Wildcard,
125}
126
127#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
129#[derive(Debug, PartialEq, Clone)]
130pub struct RecordPattern {
131 pub name: Identifier,
133 pub fields: Vec<(Identifier, Pattern)>,
135 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
137 pub span: Range<usize>,
138}
139
140#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
142#[derive(Debug, PartialEq, Clone)]
143pub enum Statement {
144 Expr(Expr),
146 Match {
148 pattern: Pattern,
150 expr: Expr,
152 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
154 span: Range<usize>,
155 },
156 Case(CaseExpr),
158 If(IfExpr),
160 Try(TryExpr),
162}
163
164#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
166#[derive(Debug, PartialEq, Clone)]
167pub enum Expr {
168 Variable(Identifier),
170 Atom(String),
172 Number(String),
174 String(String),
176 Binary(BinaryExpr),
178 List(Vec<Expr>),
180 Tuple(Vec<Expr>),
182 Record(RecordExpr),
184 Call(CallExpr),
186 Fun(FunExpr),
188 Case(CaseExpr),
190 If(IfExpr),
192 Try(TryExpr),
194 Receive(ReceiveExpr),
196}
197
198#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
200#[derive(Debug, PartialEq, Clone)]
201pub struct BinaryExpr {
202 pub left: Box<Expr>,
204 pub op: ErlangTokenType,
206 pub right: Box<Expr>,
208 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
210 pub span: Range<usize>,
211}
212
213#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
215#[derive(Debug, PartialEq, Clone)]
216pub struct CallExpr {
217 pub callee: Box<Expr>,
219 pub args: Vec<Expr>,
221 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
223 pub span: Range<usize>,
224}
225
226#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
228#[derive(Debug, PartialEq, Clone)]
229pub struct FunExpr {
230 pub clauses: Vec<FunctionClause>,
232 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
234 pub span: Range<usize>,
235}
236
237#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
239#[derive(Debug, PartialEq, Clone)]
240pub struct CaseExpr {
241 pub expr: Box<Expr>,
243 pub clauses: Vec<CaseClause>,
245 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
247 pub span: Range<usize>,
248}
249
250#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
252#[derive(Debug, PartialEq, Clone)]
253pub struct CaseClause {
254 pub pattern: Pattern,
256 pub guard: Option<Expr>,
258 pub body: Vec<Statement>,
260 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
262 pub span: Range<usize>,
263}
264
265#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
267#[derive(Debug, PartialEq, Clone)]
268pub struct IfExpr {
269 pub clauses: Vec<IfClause>,
271 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
273 pub span: Range<usize>,
274}
275
276#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
278#[derive(Debug, PartialEq, Clone)]
279pub struct IfClause {
280 pub guard: Expr,
282 pub body: Vec<Statement>,
284 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
286 pub span: Range<usize>,
287}
288
289#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
291#[derive(Debug, PartialEq, Clone)]
292pub struct TryExpr {
293 pub body: Vec<Statement>,
295 pub catch_clauses: Vec<CatchClause>,
297 pub after_clause: Option<Box<Expr>>,
299 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
301 pub span: Range<usize>,
302}
303
304#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
306#[derive(Debug, PartialEq, Clone)]
307pub struct CatchClause {
308 pub pattern: Pattern,
310 pub guard: Option<Expr>,
312 pub body: Vec<Statement>,
314 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
316 pub span: Range<usize>,
317}
318
319#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
321#[derive(Debug, PartialEq, Clone)]
322pub struct ReceiveExpr {
323 pub clauses: Vec<ReceiveClause>,
325 pub after_clause: Option<Box<Expr>>,
327 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
329 pub span: Range<usize>,
330}
331
332#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
334#[derive(Debug, PartialEq, Clone)]
335pub struct ReceiveClause {
336 pub pattern: Pattern,
338 pub guard: Option<Expr>,
340 pub body: Vec<Statement>,
342 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
344 pub span: Range<usize>,
345}
346
347#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
349#[derive(Debug, PartialEq, Clone)]
350pub struct RecordExpr {
351 pub name: Identifier,
353 pub fields: Vec<(Identifier, Expr)>,
355 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
357 pub span: Range<usize>,
358}