Skip to main content

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}