1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8pub enum ElixirTokenType {
9 Root,
11 Whitespace,
13 Newline,
15 Comment,
17 Identifier,
19 Atom,
21 Variable,
23 Number,
25 Float,
27 String,
29 Character,
31 Sigil,
33
34 After,
36 And,
38 Case,
40 Catch,
42 Cond,
44 Def,
46 Defp,
48 Defmodule,
50 Defstruct,
52 Defprotocol,
54 Defimpl,
56 Defmacro,
58 Defmacrop,
60 Do,
62 Else,
64 Elsif,
66 End,
68 False,
70 Fn,
72 If,
74 In,
76 Not,
78 Or,
80 Receive,
82 Rescue,
84 True,
86 Try,
88 Unless,
90 When,
92 With,
94
95 Plus,
98 Minus,
100 Mul,
102 Div,
104 Dot,
106 Comma,
108 Semicolon,
110 Colon,
112 LeftParen,
114 RightParen,
116 LeftBrace,
118 RightBrace,
120 LeftBracket,
122 RightBracket,
124 Arrow,
126 Pipe,
128
129 Eq,
132 EqEq,
134 Ne,
136 Lt,
138 Le,
140 Gt,
142 Ge,
144 AndAnd,
146 OrOr,
148 Bang,
150 Concat,
152 PlusPlus,
154 MinusMinus,
156 Pipeline,
158 LeftDoubleBracket,
160 RightDoubleBracket,
162 At,
164 Percent,
166
167 Error,
169}
170
171pub type ElixirToken = Token<ElixirTokenType>;
173
174impl ElixirTokenType {
175 pub fn is_keyword(self) -> bool {
176 matches!(
177 self,
178 Self::After
179 | Self::And
180 | Self::Case
181 | Self::Catch
182 | Self::Cond
183 | Self::Def
184 | Self::Defp
185 | Self::Defmodule
186 | Self::Defstruct
187 | Self::Defprotocol
188 | Self::Defimpl
189 | Self::Defmacro
190 | Self::Defmacrop
191 | Self::Do
192 | Self::Else
193 | Self::Elsif
194 | Self::End
195 | Self::False
196 | Self::Fn
197 | Self::If
198 | Self::In
199 | Self::Not
200 | Self::Or
201 | Self::Receive
202 | Self::Rescue
203 | Self::True
204 | Self::Try
205 | Self::Unless
206 | Self::When
207 | Self::With
208 )
209 }
210}
211
212impl TokenType for ElixirTokenType {
213 type Role = UniversalTokenRole;
214 const END_OF_STREAM: Self = Self::Error;
215
216 fn is_ignored(&self) -> bool {
217 matches!(self, Self::Whitespace | Self::Comment | Self::Newline)
218 }
219
220 fn role(&self) -> Self::Role {
221 match self {
222 Self::Whitespace => UniversalTokenRole::Whitespace,
223 Self::Comment => UniversalTokenRole::Comment,
224 Self::Newline => UniversalTokenRole::Whitespace,
225 Self::Identifier => UniversalTokenRole::Name,
226 Self::Number | Self::Float => UniversalTokenRole::Literal,
227 Self::String | Self::Character => UniversalTokenRole::Literal,
228 Self::Plus
229 | Self::Minus
230 | Self::Mul
231 | Self::Div
232 | Self::Dot
233 | Self::Eq
234 | Self::EqEq
235 | Self::Ne
236 | Self::Lt
237 | Self::Le
238 | Self::Gt
239 | Self::Ge
240 | Self::AndAnd
241 | Self::OrOr
242 | Self::Bang
243 | Self::Concat
244 | Self::PlusPlus
245 | Self::MinusMinus
246 | Self::Pipeline
247 | Self::Arrow
248 | Self::Pipe => UniversalTokenRole::Operator,
249 Self::Comma | Self::Semicolon | Self::Colon | Self::LeftParen | Self::RightParen | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::LeftDoubleBracket | Self::RightDoubleBracket => {
250 UniversalTokenRole::Punctuation
251 }
252 Self::Error => UniversalTokenRole::Error,
253 _ if self.is_keyword() => UniversalTokenRole::Keyword,
254 _ => UniversalTokenRole::None,
255 }
256 }
257}