Skip to main content

oak_elixir/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5use std::{boxed::Box, string::String, vec::Vec};
6
7use crate::ElixirTokenType;
8
9#[derive(Debug, PartialEq, Eq, Clone)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct Identifier {
12    pub name: String,
13    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
14    pub span: Range<usize>,
15}
16
17/// The root node of the Elixir AST.
18#[derive(Debug, PartialEq, Clone)]
19#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
20pub struct ElixirRoot {
21    pub items: Vec<Item>,
22}
23
24/// Top-level item: Module, function, or statement
25#[derive(Debug, PartialEq, Clone)]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27pub enum Item {
28    Module(Module),
29    Function(Function),
30    Statement(Statement),
31}
32
33#[derive(Debug, PartialEq, Clone)]
34#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
35pub struct Module {
36    pub name: Identifier,
37    pub items: Vec<Item>,
38    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
39    pub span: Range<usize>,
40}
41
42#[derive(Debug, PartialEq, Clone)]
43#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
44pub struct Function {
45    pub name: Identifier,
46    pub params: Vec<Param>,
47    pub body: Block,
48    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
49    pub span: Range<usize>,
50}
51
52#[derive(Debug, PartialEq, Clone)]
53#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
54pub struct Param {
55    pub name: Identifier,
56    pub ty: Option<String>,
57    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
58    pub span: Range<usize>,
59}
60
61#[derive(Debug, PartialEq, Clone)]
62#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
63pub struct Block {
64    pub statements: Vec<Statement>,
65    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
66    pub span: Range<usize>,
67}
68
69#[derive(Debug, PartialEq, Clone)]
70#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
71pub enum Statement {
72    Let {
73        name: Identifier,
74        expr: Expr,
75        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
76        span: Range<usize>,
77    },
78    ExprStmt {
79        expr: Expr,
80        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
81        span: Range<usize>,
82    },
83}
84
85#[derive(Debug, PartialEq, Clone)]
86#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
87pub enum Expr {
88    Ident(Identifier),
89    Atom {
90        value: String,
91        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
92        span: Range<usize>,
93    },
94    Number {
95        value: String,
96        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
97        span: Range<usize>,
98    },
99    String {
100        value: String,
101        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
102        span: Range<usize>,
103    },
104    Bool {
105        value: bool,
106        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
107        span: Range<usize>,
108    },
109    Unary {
110        op: ElixirTokenType,
111        expr: Box<Expr>,
112        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
113        span: Range<usize>,
114    },
115    Binary {
116        left: Box<Expr>,
117        op: ElixirTokenType,
118        right: Box<Expr>,
119        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
120        span: Range<usize>,
121    },
122    Match {
123        left: Box<Expr>,
124        right: Box<Expr>,
125        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
126        span: Range<usize>,
127    },
128    Call {
129        callee: Box<Expr>,
130        args: Vec<Expr>,
131        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
132        span: Range<usize>,
133    },
134    Field {
135        receiver: Box<Expr>,
136        field: Identifier,
137        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
138        span: Range<usize>,
139    },
140    Attribute {
141        name: Identifier,
142        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
143        span: Range<usize>,
144    },
145    Index {
146        receiver: Box<Expr>,
147        index: Box<Expr>,
148        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
149        span: Range<usize>,
150    },
151    Paren {
152        expr: Box<Expr>,
153        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
154        span: Range<usize>,
155    },
156    List {
157        items: Vec<Expr>,
158        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
159        span: Range<usize>,
160    },
161    Tuple {
162        items: Vec<Expr>,
163        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
164        span: Range<usize>,
165    },
166    Map {
167        items: Vec<Expr>,
168        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
169        span: Range<usize>,
170    },
171    Block(Block),
172}