Skip to main content

oak_elixir/parser/
element_type.rs

1use crate::lexer::token_type::ElixirTokenType;
2use oak_core::{ElementType, UniversalElementRole};
3
4/// Element types for Elixir AST.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7#[repr(u16)]
8pub enum ElixirElementType {
9    /// Root element.
10    Root,
11    /// Whitespace.
12    Whitespace,
13    /// Newline.
14    Newline,
15    /// Comment.
16    Comment,
17    /// Identifier.
18    Identifier,
19    /// Atom.
20    Atom,
21    /// Variable.
22    Variable,
23    /// Number.
24    Number,
25    /// Float.
26    Float,
27    /// String.
28    String,
29    /// Character.
30    Character,
31    /// Sigil.
32    Sigil,
33
34    /// `after`
35    After,
36    /// `and`
37    And,
38    /// `case`
39    Case,
40    /// `catch`
41    Catch,
42    /// `cond`
43    Cond,
44    /// `def`
45    Def,
46    /// `defp`
47    Defp,
48    /// `defmodule`
49    Defmodule,
50    /// `defstruct`
51    Defstruct,
52    /// `defprotocol`
53    Defprotocol,
54    /// `defimpl`
55    Defimpl,
56    /// `defmacro`
57    Defmacro,
58    /// `defmacrop`
59    Defmacrop,
60    /// `do`
61    Do,
62    /// `else`
63    Else,
64    /// `elsif`
65    Elsif,
66    /// `end`
67    End,
68    /// `false`
69    False,
70    /// `fn`
71    Fn,
72    /// `if`
73    If,
74    /// `in`
75    In,
76    /// `not`
77    Not,
78    /// `or`
79    Or,
80    /// `receive`
81    Receive,
82    /// `rescue`
83    Rescue,
84    /// `true`
85    True,
86    /// `try`
87    Try,
88    /// `unless`
89    Unless,
90    /// `when`
91    When,
92    /// `with`
93    With,
94
95    /// `+`
96    Plus,
97    /// `-`
98    Minus,
99    /// `*`
100    Mul,
101    /// `/`
102    Div,
103    /// `.`
104    Dot,
105    /// `,`
106    Comma,
107    /// `;`
108    Semicolon,
109    /// `:`
110    Colon,
111    /// `(`
112    LeftParen,
113    /// `)`
114    RightParen,
115    /// `{`
116    LeftBrace,
117    /// `}`
118    RightBrace,
119    /// `[`
120    LeftBracket,
121    /// `]`
122    RightBracket,
123    /// `->`
124    Arrow,
125    /// `|`
126    Pipe,
127
128    /// Module definition.
129    ModuleDefinition,
130    /// Function definition.
131    FunctionDefinition,
132    /// Call expression.
133    CallExpression,
134    /// Binary expression.
135    BinaryExpression,
136    /// Unary expression.
137    UnaryExpression,
138    /// Literal expression.
139    LiteralExpression,
140    /// Identifier expression.
141    IdentifierExpression,
142    /// Attribute expression.
143    AttributeExpression,
144    /// Access expression.
145    AccessExpression,
146    /// List literal.
147    ListLiteral,
148    /// Tuple literal.
149    TupleLiteral,
150    /// Map literal.
151    MapLiteral,
152    /// Keyword literal.
153    KeywordLiteral,
154    /// Block expression.
155    BlockExpression,
156    /// Match expression.
157    MatchExpression,
158    /// `@`
159    At,
160    /// `%`
161    Percent,
162
163    /// Error element.
164    Error,
165}
166
167impl ElementType for ElixirElementType {
168    type Role = UniversalElementRole;
169
170    fn role(&self) -> Self::Role {
171        match self {
172            Self::Root => UniversalElementRole::Root,
173            Self::Error => UniversalElementRole::Error,
174            _ => UniversalElementRole::None,
175        }
176    }
177}
178
179impl From<ElixirTokenType> for ElixirElementType {
180    fn from(t: ElixirTokenType) -> Self {
181        type T = ElixirTokenType;
182        match t {
183            T::Root => Self::Root,
184            T::Whitespace => Self::Whitespace,
185            T::Newline => Self::Newline,
186            T::Comment => Self::Comment,
187            T::Identifier => Self::Identifier,
188            T::Atom => Self::Atom,
189            T::Variable => Self::Variable,
190            T::Number => Self::Number,
191            T::Float => Self::Float,
192            T::String => Self::String,
193            T::Character => Self::Character,
194            T::Sigil => Self::Sigil,
195            T::After => Self::After,
196            T::And => Self::And,
197            T::Case => Self::Case,
198            T::Catch => Self::Catch,
199            T::Cond => Self::Cond,
200            T::Def => Self::Def,
201            T::Defp => Self::Defp,
202            T::Defmodule => Self::Defmodule,
203            T::Defstruct => Self::Defstruct,
204            T::Defprotocol => Self::Defprotocol,
205            T::Defimpl => Self::Defimpl,
206            T::Defmacro => Self::Defmacro,
207            T::Defmacrop => Self::Defmacrop,
208            T::Do => Self::Do,
209            T::Else => Self::Else,
210            T::Elsif => Self::Elsif,
211            T::End => Self::End,
212            T::False => Self::False,
213            T::Fn => Self::Fn,
214            T::If => Self::If,
215            T::In => Self::In,
216            T::Not => Self::Not,
217            T::Or => Self::Or,
218            T::Receive => Self::Receive,
219            T::Rescue => Self::Rescue,
220            T::True => Self::True,
221            T::Try => Self::Try,
222            T::Unless => Self::Unless,
223            T::When => Self::When,
224            T::With => Self::With,
225            T::Plus => Self::Plus,
226            T::Minus => Self::Minus,
227            T::Mul => Self::Mul,
228            T::Div => Self::Div,
229            T::Dot => Self::Dot,
230            T::Comma => Self::Comma,
231            T::Semicolon => Self::Semicolon,
232            T::Colon => Self::Colon,
233            T::LeftParen => Self::LeftParen,
234            T::RightParen => Self::RightParen,
235            T::LeftBrace => Self::LeftBrace,
236            T::RightBrace => Self::RightBrace,
237            T::LeftBracket => Self::LeftBracket,
238            T::RightBracket => Self::RightBracket,
239            T::Arrow => Self::Arrow,
240            T::Pipe => Self::Pipe,
241
242            T::Eq => Self::MatchExpression,
243            T::EqEq => Self::BinaryExpression,
244            T::Ne => Self::BinaryExpression,
245            T::Lt => Self::BinaryExpression,
246            T::Le => Self::BinaryExpression,
247            T::Gt => Self::BinaryExpression,
248            T::Ge => Self::BinaryExpression,
249            T::AndAnd => Self::BinaryExpression,
250            T::OrOr => Self::BinaryExpression,
251            T::Bang => Self::UnaryExpression,
252            T::Concat => Self::BinaryExpression,
253            T::PlusPlus => Self::BinaryExpression,
254            T::MinusMinus => Self::BinaryExpression,
255            T::Pipeline => Self::BinaryExpression,
256            T::At => Self::At,
257            T::Percent => Self::Percent,
258            T::LeftDoubleBracket => Self::LeftBracket,
259            T::RightDoubleBracket => Self::RightBracket,
260
261            T::Error => Self::Error,
262        }
263    }
264}