oak_java/lexer/token_type.rs
1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5/// A token in the Java language.
6pub type JavaToken = Token<JavaTokenType>;
7
8/// Java token type.
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub enum JavaTokenType {
12 /// Whitespace.
13 Whitespace,
14 /// Line comment.
15 LineComment,
16 /// Block comment.
17 BlockComment,
18 /// Identifier.
19 Identifier,
20 /// String literal.
21 StringLiteral,
22 /// Character literal.
23 CharacterLiteral,
24 /// Integer literal.
25 IntegerLiteral,
26 /// Floating point literal.
27 FloatingPointLiteral,
28 /// Boolean literal.
29 BooleanLiteral,
30 /// Null literal.
31 NullLiteral,
32
33 // Keywords
34 /// `abstract` keyword.
35 Abstract,
36 /// `assert` keyword.
37 Assert,
38 /// `boolean` keyword.
39 Boolean,
40 /// `break` keyword.
41 Break,
42 /// `byte` keyword.
43 Byte,
44 /// `case` keyword.
45 Case,
46 /// `catch` keyword.
47 Catch,
48 /// `char` keyword.
49 Char,
50 /// `class` keyword.
51 Class,
52 /// `const` keyword.
53 Const,
54 /// `continue` keyword.
55 Continue,
56 /// `default` keyword.
57 Default,
58 /// `do` keyword.
59 Do,
60 /// `double` keyword.
61 Double,
62 /// `else` keyword.
63 Else,
64 /// `enum` keyword.
65 Enum,
66 /// `extends` keyword.
67 Extends,
68 /// `final` keyword.
69 Final,
70 /// `finally` keyword.
71 Finally,
72 /// `float` keyword.
73 Float,
74 /// `for` keyword.
75 For,
76 /// `if` keyword.
77 If,
78 /// `goto` keyword.
79 Goto,
80 /// `implements` keyword.
81 Implements,
82 /// `import` keyword.
83 Import,
84 /// `instanceof` keyword.
85 Instanceof,
86 /// `int` keyword.
87 Int,
88 /// `interface` keyword.
89 Interface,
90 /// `long` keyword.
91 Long,
92 /// `native` keyword.
93 Native,
94 /// `new` keyword.
95 New,
96 /// `package` keyword.
97 Package,
98 /// `private` keyword.
99 Private,
100 /// `protected` keyword.
101 Protected,
102 /// `public` keyword.
103 Public,
104 /// `record` keyword.
105 Record,
106 /// `return` keyword.
107 Return,
108 /// `short` keyword.
109 Short,
110 /// `static` keyword.
111 Static,
112 /// `strictfp` keyword.
113 Strictfp,
114 /// `struct` keyword.
115 Struct,
116 /// `super` keyword.
117 Super,
118 /// `switch` keyword.
119 Switch,
120 /// `synchronized` keyword.
121 Synchronized,
122 /// `this` keyword.
123 This,
124 /// `throw` keyword.
125 Throw,
126 /// `throws` keyword.
127 Throws,
128 /// `transient` keyword.
129 Transient,
130 /// `try` keyword.
131 Try,
132 /// `void` keyword.
133 Void,
134 /// `volatile` keyword.
135 Volatile,
136 /// `while` keyword.
137 While,
138
139 // Operators and Delimiters
140 /// `+` operator.
141 Plus,
142 /// `++` operator.
143 PlusPlus,
144 /// `+=` operator.
145 PlusEquals,
146 /// `-` operator.
147 Minus,
148 /// `--` operator.
149 MinusMinus,
150 /// `-=` operator.
151 MinusEquals,
152 /// `*` operator.
153 Asterisk,
154 /// `*=` operator.
155 AsteriskEquals,
156 /// `/` operator.
157 Slash,
158 /// `/=` operator.
159 SlashEquals,
160 /// `%` operator.
161 Percent,
162 /// `%=` operator.
163 PercentEquals,
164 /// `=` operator.
165 Assign,
166 /// `==` operator.
167 Equals,
168 /// `!` operator.
169 Bang,
170 /// `!=` operator.
171 BangEquals,
172 /// `<` operator.
173 LessThan,
174 /// `<=` operator.
175 LessThanEquals,
176 /// `<<` operator.
177 LeftShift,
178 /// `<<=` operator.
179 LeftShiftEquals,
180 /// `>` operator.
181 GreaterThan,
182 /// `>=` operator.
183 GreaterThanEquals,
184 /// `>>` operator.
185 RightShift,
186 /// `>>=` operator.
187 RightShiftEquals,
188 /// `>>>` operator.
189 UnsignedRightShift,
190 /// `>>>=` operator.
191 UnsignedRightShiftEquals,
192 /// `&` operator.
193 Ampersand,
194 /// `&&` operator.
195 AmpersandAmpersand,
196 /// `&=` operator.
197 AmpersandEquals,
198 /// `|` operator.
199 Pipe,
200 /// `||` operator.
201 PipePipe,
202 /// `|=` operator.
203 PipeEquals,
204 /// `^` operator.
205 Caret,
206 /// `^=` operator.
207 CaretEquals,
208 /// `~` operator.
209 Tilde,
210 /// `?` operator.
211 Question,
212 /// `:` delimiter.
213 Colon,
214 /// `;` delimiter.
215 Semicolon,
216 /// `,` delimiter.
217 Comma,
218 /// `.` delimiter.
219 Dot,
220 /// `...` delimiter.
221 Ellipsis,
222 /// `(` delimiter.
223 LeftParen,
224 /// `)` delimiter.
225 RightParen,
226 /// `{` delimiter.
227 LeftBrace,
228 /// `}` delimiter.
229 RightBrace,
230 /// `[` delimiter.
231 LeftBracket,
232 /// `]` delimiter.
233 RightBracket,
234 /// `@` delimiter.
235 At,
236 /// `::` delimiter.
237 DoubleColon,
238
239 /// Error token.
240 Error,
241 /// End of file token.
242 EndOfFile,
243}
244
245impl TokenType for JavaTokenType {
246 type Role = UniversalTokenRole;
247 const END_OF_STREAM: Self = Self::EndOfFile;
248
249 fn role(&self) -> Self::Role {
250 use UniversalTokenRole::*;
251 match self {
252 Self::Whitespace => Whitespace,
253 Self::LineComment | Self::BlockComment => Comment,
254 Self::Identifier => Name,
255 Self::StringLiteral | Self::CharacterLiteral | Self::IntegerLiteral | Self::FloatingPointLiteral | Self::BooleanLiteral | Self::NullLiteral => Literal,
256 _ if self.is_keyword() => Keyword,
257 Self::Plus
258 | Self::PlusPlus
259 | Self::PlusEquals
260 | Self::Minus
261 | Self::MinusMinus
262 | Self::MinusEquals
263 | Self::Asterisk
264 | Self::AsteriskEquals
265 | Self::Slash
266 | Self::SlashEquals
267 | Self::Percent
268 | Self::PercentEquals
269 | Self::Assign
270 | Self::Equals
271 | Self::Bang
272 | Self::BangEquals
273 | Self::LessThan
274 | Self::LessThanEquals
275 | Self::LeftShift
276 | Self::LeftShiftEquals
277 | Self::GreaterThan
278 | Self::GreaterThanEquals
279 | Self::RightShift
280 | Self::RightShiftEquals
281 | Self::UnsignedRightShift
282 | Self::UnsignedRightShiftEquals
283 | Self::Ampersand
284 | Self::AmpersandAmpersand
285 | Self::AmpersandEquals
286 | Self::Pipe
287 | Self::PipePipe
288 | Self::PipeEquals
289 | Self::Caret
290 | Self::CaretEquals
291 | Self::Tilde => Operator,
292 Self::Question | Self::Colon | Self::Semicolon | Self::Comma | Self::Dot | Self::Ellipsis | Self::LeftParen | Self::RightParen | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::At | Self::DoubleColon => {
293 Punctuation
294 }
295 Self::Error => Error,
296 Self::EndOfFile => Eof,
297 _ if self.is_keyword() => Keyword,
298 _ => None,
299 }
300 }
301}
302
303impl JavaTokenType {
304 /// Returns true if the token type is a Java keyword.
305 pub fn is_keyword(&self) -> bool {
306 matches!(
307 self,
308 Self::Abstract
309 | Self::Assert
310 | Self::Boolean
311 | Self::Break
312 | Self::Byte
313 | Self::Case
314 | Self::Catch
315 | Self::Char
316 | Self::Class
317 | Self::Const
318 | Self::Continue
319 | Self::Default
320 | Self::Do
321 | Self::Double
322 | Self::Else
323 | Self::Enum
324 | Self::Extends
325 | Self::Final
326 | Self::Finally
327 | Self::Float
328 | Self::For
329 | Self::If
330 | Self::Goto
331 | Self::Implements
332 | Self::Import
333 | Self::Instanceof
334 | Self::Int
335 | Self::Interface
336 | Self::Long
337 | Self::Native
338 | Self::New
339 | Self::Package
340 | Self::Private
341 | Self::Protected
342 | Self::Public
343 | Self::Record
344 | Self::Return
345 | Self::Short
346 | Self::Static
347 | Self::Strictfp
348 | Self::Struct
349 | Self::Super
350 | Self::Switch
351 | Self::Synchronized
352 | Self::This
353 | Self::Throw
354 | Self::Throws
355 | Self::Transient
356 | Self::Try
357 | Self::Void
358 | Self::Volatile
359 | Self::While
360 )
361 }
362}