1use core::range::Range;
2use serde::{Deserialize, Serialize};
3use std::{boxed::Box, string::String, vec::Vec};
4
5use crate::ElixirSyntaxKind;
6
7#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
8pub struct Identifier {
9 pub name: String,
10 #[serde(with = "oak_core::serde_range")]
11 pub span: Range<usize>,
12}
13
14#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
16pub struct ElixirRoot {
17 pub items: Vec<Item>,
18}
19
20#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
22pub enum Item {
23 Module(Module),
24 Function(Function),
25 Statement(Statement),
26}
27
28#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
29pub struct Module {
30 pub name: Identifier,
31 pub items: Vec<Item>,
32 #[serde(with = "oak_core::serde_range")]
33 pub span: Range<usize>,
34}
35
36#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
37pub struct Function {
38 pub name: Identifier,
39 pub params: Vec<Param>,
40 pub body: Block,
41 #[serde(with = "oak_core::serde_range")]
42 pub span: Range<usize>,
43}
44
45#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
46pub struct Param {
47 pub name: Identifier,
48 pub ty: Option<String>,
49 #[serde(with = "oak_core::serde_range")]
50 pub span: Range<usize>,
51}
52
53#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
54pub struct Block {
55 pub statements: Vec<Statement>,
56 #[serde(with = "oak_core::serde_range")]
57 pub span: Range<usize>,
58}
59
60#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
61pub enum Statement {
62 Let {
63 name: Identifier,
64 expr: Expr,
65 #[serde(with = "oak_core::serde_range")]
66 span: Range<usize>,
67 },
68 ExprStmt {
69 expr: Expr,
70 #[serde(with = "oak_core::serde_range")]
71 span: Range<usize>,
72 },
73}
74
75#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
76pub enum Expr {
77 Ident(Identifier),
78 Atom {
79 value: String,
80 #[serde(with = "oak_core::serde_range")]
81 span: Range<usize>,
82 },
83 Number {
84 value: String,
85 #[serde(with = "oak_core::serde_range")]
86 span: Range<usize>,
87 },
88 String {
89 value: String,
90 #[serde(with = "oak_core::serde_range")]
91 span: Range<usize>,
92 },
93 Bool {
94 value: bool,
95 #[serde(with = "oak_core::serde_range")]
96 span: Range<usize>,
97 },
98 Unary {
99 op: ElixirSyntaxKind,
100 expr: Box<Expr>,
101 #[serde(with = "oak_core::serde_range")]
102 span: Range<usize>,
103 },
104 Binary {
105 left: Box<Expr>,
106 op: ElixirSyntaxKind,
107 right: Box<Expr>,
108 #[serde(with = "oak_core::serde_range")]
109 span: Range<usize>,
110 },
111 Call {
112 callee: Box<Expr>,
113 args: Vec<Expr>,
114 #[serde(with = "oak_core::serde_range")]
115 span: Range<usize>,
116 },
117 Field {
118 receiver: Box<Expr>,
119 field: Identifier,
120 #[serde(with = "oak_core::serde_range")]
121 span: Range<usize>,
122 },
123 Index {
124 receiver: Box<Expr>,
125 index: Box<Expr>,
126 #[serde(with = "oak_core::serde_range")]
127 span: Range<usize>,
128 },
129 Paren {
130 expr: Box<Expr>,
131 #[serde(with = "oak_core::serde_range")]
132 span: Range<usize>,
133 },
134 Block(Block),
135}