1use crate::lexer::token_type::ElixirTokenType;
2use oak_core::{ElementType, UniversalElementRole};
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9#[repr(u16)]
10pub enum ElixirElementType {
11 Root,
13 Whitespace,
15 Newline,
17 Comment,
19 Identifier,
21 Atom,
23 Variable,
25 Number,
27 Float,
29 String,
31 Character,
33 Sigil,
35
36 After,
38 And,
40 Case,
42 Catch,
44 Cond,
46 Def,
48 Defp,
50 Defmodule,
52 Defstruct,
54 Defprotocol,
56 Defimpl,
58 Defmacro,
60 Defmacrop,
62 Do,
64 Else,
66 Elsif,
68 End,
70 False,
72 Fn,
74 If,
76 In,
78 Not,
80 Or,
82 Receive,
84 Rescue,
86 True,
88 Try,
90 Unless,
92 When,
94 With,
96
97 Plus,
99 Minus,
101 Mul,
103 Div,
105 Dot,
107 Comma,
109 Semicolon,
111 Colon,
113 LeftParen,
115 RightParen,
117 LeftBrace,
119 RightBrace,
121 LeftBracket,
123 RightBracket,
125 Arrow,
127 Pipe,
129
130 ModuleDefinition,
132 FunctionDefinition,
134 CallExpression,
136 BinaryExpression,
138 UnaryExpression,
140 LiteralExpression,
142 IdentifierExpression,
144 AttributeExpression,
146 AccessExpression,
148 ListLiteral,
150 TupleLiteral,
152 MapLiteral,
154 KeywordLiteral,
156 BlockExpression,
158 MatchExpression,
160 At,
162 Percent,
164
165 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}