Skip to main content

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}