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