Skip to main content

oak_elixir/parser/
element_type.rs

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