1use oak_core::{Token, TokenType, UniversalTokenRole};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub enum ElixirTokenType {
8 Root,
10 Whitespace,
12 Newline,
14 Comment,
16 Identifier,
18 Atom,
20 Variable,
22 Number,
24 Float,
26 String,
28 Character,
30 Sigil,
32
33 After,
35 And,
37 Case,
39 Catch,
41 Cond,
43 Def,
45 Defp,
47 Defmodule,
49 Defstruct,
51 Defprotocol,
53 Defimpl,
55 Defmacro,
57 Defmacrop,
59 Do,
61 Else,
63 Elsif,
65 End,
67 False,
69 Fn,
71 If,
73 In,
75 Not,
77 Or,
79 Receive,
81 Rescue,
83 True,
85 Try,
87 Unless,
89 When,
91 With,
93
94 Plus,
97 Minus,
99 Mul,
101 Div,
103 Dot,
105 Comma,
107 Semicolon,
109 Colon,
111 LeftParen,
113 RightParen,
115 LeftBrace,
117 RightBrace,
119 LeftBracket,
121 RightBracket,
123 Arrow,
125 Pipe,
127
128 Eq,
131 EqEq,
133 Ne,
135 Lt,
137 Le,
139 Gt,
141 Ge,
143 AndAnd,
145 OrOr,
147 Bang,
149 Concat,
151 PlusPlus,
153 MinusMinus,
155 Pipeline,
157 LeftDoubleBracket,
159 RightDoubleBracket,
161 At,
163 Percent,
165
166 Error,
168}
169
170pub type ElixirToken = Token<ElixirTokenType>;
172
173impl ElixirTokenType {
174 pub fn is_keyword(self) -> bool {
175 matches!(
176 self,
177 Self::After
178 | Self::And
179 | Self::Case
180 | Self::Catch
181 | Self::Cond
182 | Self::Def
183 | Self::Defp
184 | Self::Defmodule
185 | Self::Defstruct
186 | Self::Defprotocol
187 | Self::Defimpl
188 | Self::Defmacro
189 | Self::Defmacrop
190 | Self::Do
191 | Self::Else
192 | Self::Elsif
193 | Self::End
194 | Self::False
195 | Self::Fn
196 | Self::If
197 | Self::In
198 | Self::Not
199 | Self::Or
200 | Self::Receive
201 | Self::Rescue
202 | Self::True
203 | Self::Try
204 | Self::Unless
205 | Self::When
206 | Self::With
207 )
208 }
209}
210
211impl TokenType for ElixirTokenType {
212 type Role = UniversalTokenRole;
213 const END_OF_STREAM: Self = Self::Error;
214
215 fn is_ignored(&self) -> bool {
216 matches!(self, Self::Whitespace | Self::Comment | Self::Newline)
217 }
218
219 fn role(&self) -> Self::Role {
220 match self {
221 Self::Whitespace => UniversalTokenRole::Whitespace,
222 Self::Comment => UniversalTokenRole::Comment,
223 Self::Newline => UniversalTokenRole::Whitespace,
224 Self::Identifier => UniversalTokenRole::Name,
225 Self::Number | Self::Float => UniversalTokenRole::Literal,
226 Self::String | Self::Character => UniversalTokenRole::Literal,
227 Self::Plus
228 | Self::Minus
229 | Self::Mul
230 | Self::Div
231 | Self::Dot
232 | Self::Eq
233 | Self::EqEq
234 | Self::Ne
235 | Self::Lt
236 | Self::Le
237 | Self::Gt
238 | Self::Ge
239 | Self::AndAnd
240 | Self::OrOr
241 | Self::Bang
242 | Self::Concat
243 | Self::PlusPlus
244 | Self::MinusMinus
245 | Self::Pipeline
246 | Self::Arrow
247 | Self::Pipe => UniversalTokenRole::Operator,
248 Self::Comma | Self::Semicolon | Self::Colon | Self::LeftParen | Self::RightParen | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::LeftDoubleBracket | Self::RightDoubleBracket => {
249 UniversalTokenRole::Punctuation
250 }
251 Self::Error => UniversalTokenRole::Error,
252 _ if self.is_keyword() => UniversalTokenRole::Keyword,
253 _ => UniversalTokenRole::None,
254 }
255 }
256}