1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7pub enum ElixirTokenType {
8 Root,
9 Whitespace,
10 Newline,
11 Comment,
12 Identifier,
13 Atom,
14 Variable,
15 Number,
16 Float,
17 String,
18 Character,
19 Sigil,
20
21 After,
22 And,
23 Case,
24 Catch,
25 Cond,
26 Def,
27 Defp,
28 Defmodule,
29 Defstruct,
30 Defprotocol,
31 Defimpl,
32 Defmacro,
33 Defmacrop,
34 Do,
35 Else,
36 Elsif,
37 End,
38 False,
39 Fn,
40 If,
41 In,
42 Not,
43 Or,
44 Receive,
45 Rescue,
46 True,
47 Try,
48 Unless,
49 When,
50 With,
51
52 Plus,
54 Minus,
55 Mul,
56 Div,
57 Dot,
58 Comma,
59 Semicolon,
60 Colon,
61 LeftParen,
62 RightParen,
63 LeftBrace,
64 RightBrace,
65 LeftBracket,
66 RightBracket,
67 Arrow,
68 Pipe,
69
70 Eq,
72 EqEq,
73 Ne,
74 Lt,
75 Le,
76 Gt,
77 Ge,
78 AndAnd,
79 OrOr,
80 Bang,
81 Concat,
82 PlusPlus,
83 MinusMinus,
84 Pipeline,
85 LeftDoubleBracket,
86 RightDoubleBracket,
87 At,
88 Percent,
89
90 Error,
91}
92
93pub type ElixirToken = Token<ElixirTokenType>;
94
95impl ElixirTokenType {
96 pub fn is_keyword(self) -> bool {
97 matches!(
98 self,
99 Self::After
100 | Self::And
101 | Self::Case
102 | Self::Catch
103 | Self::Cond
104 | Self::Def
105 | Self::Defp
106 | Self::Defmodule
107 | Self::Defstruct
108 | Self::Defprotocol
109 | Self::Defimpl
110 | Self::Defmacro
111 | Self::Defmacrop
112 | Self::Do
113 | Self::Else
114 | Self::Elsif
115 | Self::End
116 | Self::False
117 | Self::Fn
118 | Self::If
119 | Self::In
120 | Self::Not
121 | Self::Or
122 | Self::Receive
123 | Self::Rescue
124 | Self::True
125 | Self::Try
126 | Self::Unless
127 | Self::When
128 | Self::With
129 )
130 }
131}
132
133impl TokenType for ElixirTokenType {
134 type Role = UniversalTokenRole;
135 const END_OF_STREAM: Self = Self::Error;
136
137 fn is_ignored(&self) -> bool {
138 matches!(self, Self::Whitespace | Self::Comment | Self::Newline)
139 }
140
141 fn role(&self) -> Self::Role {
142 match self {
143 Self::Whitespace => UniversalTokenRole::Whitespace,
144 Self::Comment => UniversalTokenRole::Comment,
145 Self::Newline => UniversalTokenRole::Whitespace,
146 Self::Identifier => UniversalTokenRole::Name,
147 Self::Number | Self::Float => UniversalTokenRole::Literal,
148 Self::String | Self::Character => UniversalTokenRole::Literal,
149 Self::Plus
150 | Self::Minus
151 | Self::Mul
152 | Self::Div
153 | Self::Dot
154 | Self::Eq
155 | Self::EqEq
156 | Self::Ne
157 | Self::Lt
158 | Self::Le
159 | Self::Gt
160 | Self::Ge
161 | Self::AndAnd
162 | Self::OrOr
163 | Self::Bang
164 | Self::Concat
165 | Self::PlusPlus
166 | Self::MinusMinus
167 | Self::Pipeline
168 | Self::Arrow
169 | Self::Pipe => UniversalTokenRole::Operator,
170 Self::Comma | Self::Semicolon | Self::Colon | Self::LeftParen | Self::RightParen | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::LeftDoubleBracket | Self::RightDoubleBracket => {
171 UniversalTokenRole::Punctuation
172 }
173 Self::Error => UniversalTokenRole::Error,
174 _ if self.is_keyword() => UniversalTokenRole::Keyword,
175 _ => UniversalTokenRole::None,
176 }
177 }
178}