1use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2use std::fmt;
3
4pub type RubyToken = Token<RubyTokenType>;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10#[repr(u8)]
11pub enum RubyTokenType {
12 Identifier,
14 GlobalVariable,
16 InstanceVariable,
18 ClassVariable,
20 Constant,
22 IntegerLiteral,
24 FloatLiteral,
26 StringLiteral,
28 Literal,
30 Symbol,
32 RegexLiteral,
34
35 If,
37 Unless,
39 Elsif,
41 Else,
43 Case,
45 When,
47 Then,
49 For,
51 While,
53 Until,
55 Break,
57 Next,
59 Redo,
61 Retry,
63 Return,
65 Yield,
67 Def,
69 Class,
71 Module,
73 End,
75 Lambda,
77 Proc,
79 Begin,
81 Rescue,
83 Ensure,
85 Raise,
87 Require,
89 Load,
91 Include,
93 Extend,
95 Prepend,
97 And,
99 Or,
101 EqualGreater,
103 Not,
105 In,
107 True,
109 False,
111 Nil,
113 Super,
115 Self_,
117 Alias,
119 Undef,
121 Defined,
123 Do,
125
126 Plus,
128 Minus,
130 Multiply,
132 Divide,
134 Modulo,
136 Power,
138 EqualEqual,
140 NotEqual,
142 Less,
144 Greater,
146 LessEqual,
148 GreaterEqual,
150 EqualEqualEqual,
152 Spaceship,
154 Assign,
156 PlusAssign,
158 MinusAssign,
160 MultiplyAssign,
162 DivideAssign,
164 ModuloAssign,
166 PowerAssign,
168 BitAnd,
170 BitOr,
172 Xor,
174 LogicalNot,
176 Tilde,
178 LeftShift,
180 RightShift,
182 AndAssign,
184 OrAssign,
186 XorAssign,
188 LeftShiftAssign,
190 RightShiftAssign,
192 AndAnd,
194 OrOr,
196 OrOrAssign,
198 AndAndAssign,
200 Question,
202 DotDot,
204 DotDotDot,
206 Match,
208 NotMatch,
210
211 LeftParen,
213 RightParen,
215 LeftBracket,
217 RightBracket,
219 LeftBrace,
221 RightBrace,
223 Comma,
225 Colon,
227 Semicolon,
229 Dot,
231 DoubleColon,
233 At,
235 Dollar,
237
238 Whitespace,
240 Newline,
242 Comment,
244 Eof,
246 Invalid,
248 Root,
250 BinaryExpression,
252 UnaryExpression,
254 LiteralExpression,
256 ParenExpression,
258 ParenthesizedExpression,
260 MethodDefinition,
262 ClassDefinition,
264 ModuleDefinition,
266 IfStatement,
268 WhileStatement,
270 ReturnStatement,
272 IfExpression,
274 CallExpression,
276 MemberAccess,
278 ParameterList,
280 ArgumentList,
282 Error,
284 Equal,
286}
287
288impl RubyTokenType {
289 pub fn is_ignored(&self) -> bool {
291 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
292 }
293
294 pub fn is_keyword(&self) -> bool {
296 matches!(
297 self,
298 Self::If
299 | Self::Unless
300 | Self::Elsif
301 | Self::Else
302 | Self::Case
303 | Self::When
304 | Self::Then
305 | Self::For
306 | Self::While
307 | Self::Until
308 | Self::Break
309 | Self::Next
310 | Self::Redo
311 | Self::Retry
312 | Self::Return
313 | Self::Yield
314 | Self::Def
315 | Self::Class
316 | Self::Module
317 | Self::End
318 | Self::Lambda
319 | Self::Proc
320 | Self::Begin
321 | Self::Rescue
322 | Self::Ensure
323 | Self::Raise
324 | Self::Require
325 | Self::Load
326 | Self::Include
327 | Self::Extend
328 | Self::Prepend
329 | Self::And
330 | Self::Or
331 | Self::Not
332 | Self::In
333 | Self::True
334 | Self::False
335 | Self::Nil
336 | Self::Super
337 | Self::Self_
338 | Self::Alias
339 | Self::Undef
340 | Self::Defined
341 | Self::Do
342 )
343 }
344}
345
346impl fmt::Display for RubyTokenType {
347 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
348 let name = match self {
349 Self::Identifier => "Identifier",
350 Self::GlobalVariable => "GlobalVariable",
351 Self::InstanceVariable => "InstanceVariable",
352 Self::ClassVariable => "ClassVariable",
353 Self::Constant => "Constant",
354 Self::IntegerLiteral => "IntegerLiteral",
355 Self::FloatLiteral => "FloatLiteral",
356 Self::StringLiteral => "StringLiteral",
357 Self::Literal => "Literal",
358 Self::Symbol => "Symbol",
359 Self::RegexLiteral => "RegexLiteral",
360
361 Self::If => "If",
362 Self::Unless => "Unless",
363 Self::Elsif => "Elsif",
364 Self::Else => "Else",
365 Self::Case => "Case",
366 Self::When => "When",
367 Self::Then => "Then",
368 Self::For => "For",
369 Self::While => "While",
370 Self::Until => "Until",
371 Self::Break => "Break",
372 Self::Next => "Next",
373 Self::Redo => "Redo",
374 Self::Retry => "Retry",
375 Self::Return => "Return",
376 Self::Yield => "Yield",
377 Self::Def => "Def",
378 Self::Class => "Class",
379 Self::Module => "Module",
380 Self::End => "End",
381 Self::Lambda => "Lambda",
382 Self::Proc => "Proc",
383 Self::Begin => "Begin",
384 Self::Rescue => "Rescue",
385 Self::Ensure => "Ensure",
386 Self::Raise => "Raise",
387 Self::Require => "Require",
388 Self::Load => "Load",
389 Self::Include => "Include",
390 Self::Extend => "Extend",
391 Self::Prepend => "Prepend",
392 Self::And => "And",
393 Self::Or => "Or",
394 Self::Not => "Not",
395 Self::In => "In",
396 Self::True => "True",
397 Self::False => "False",
398 Self::Nil => "Nil",
399 Self::Super => "Super",
400 Self::Self_ => "Self",
401 Self::Alias => "Alias",
402 Self::Undef => "Undef",
403 Self::Defined => "Defined",
404 Self::Do => "Do",
405
406 Self::Plus => "Plus",
407 Self::Minus => "Minus",
408 Self::Multiply => "Multiply",
409 Self::Divide => "Divide",
410 Self::Modulo => "Modulo",
411 Self::Power => "Power",
412 Self::EqualEqual => "EqualEqual",
413 Self::EqualGreater => "EqualGreater",
414 Self::NotEqual => "NotEqual",
415 Self::Less => "Less",
416 Self::Greater => "Greater",
417 Self::LessEqual => "LessEqual",
418 Self::GreaterEqual => "GreaterEqual",
419 Self::EqualEqualEqual => "EqualEqualEqual",
420 Self::Spaceship => "Spaceship",
421 Self::Assign => "Assign",
422 Self::PlusAssign => "PlusAssign",
423 Self::MinusAssign => "MinusAssign",
424 Self::MultiplyAssign => "MultiplyAssign",
425 Self::DivideAssign => "DivideAssign",
426 Self::ModuloAssign => "ModuloAssign",
427 Self::PowerAssign => "PowerAssign",
428 Self::BitAnd => "BitAnd",
429 Self::BitOr => "BitOr",
430 Self::Xor => "Xor",
431 Self::LogicalNot => "LogicalNot",
432 Self::Tilde => "Tilde",
433 Self::LeftShift => "LeftShift",
434 Self::RightShift => "RightShift",
435 Self::AndAssign => "AndAssign",
436 Self::OrAssign => "OrAssign",
437 Self::XorAssign => "XorAssign",
438 Self::LeftShiftAssign => "LeftShiftAssign",
439 Self::RightShiftAssign => "RightShiftAssign",
440 Self::AndAnd => "AndAnd",
441 Self::OrOr => "OrOr",
442 Self::OrOrAssign => "OrOrAssign",
443 Self::AndAndAssign => "AndAndAssign",
444 Self::Question => "Question",
445 Self::DotDot => "DotDot",
446 Self::DotDotDot => "DotDotDot",
447 Self::Match => "Match",
448 Self::NotMatch => "NotMatch",
449
450 Self::LeftParen => "LeftParen",
451 Self::RightParen => "RightParen",
452 Self::LeftBracket => "LeftBracket",
453 Self::RightBracket => "RightBracket",
454 Self::LeftBrace => "LeftBrace",
455 Self::RightBrace => "RightBrace",
456 Self::Comma => "Comma",
457 Self::Colon => "Colon",
458 Self::Semicolon => "Semicolon",
459 Self::Dot => "Dot",
460 Self::DoubleColon => "DoubleColon",
461 Self::At => "At",
462 Self::Dollar => "Dollar",
463
464 Self::Whitespace => "Whitespace",
465 Self::Newline => "Newline",
466 Self::Comment => "Comment",
467 Self::Eof => "Eof",
468 Self::Invalid => "Invalid",
469 Self::Root => "Root",
470 Self::BinaryExpression => "BinaryExpression",
471 Self::UnaryExpression => "UnaryExpression",
472 Self::LiteralExpression => "LiteralExpression",
473 Self::ParenExpression => "ParenExpression",
474 Self::ParenthesizedExpression => "ParenthesizedExpression",
475 Self::MethodDefinition => "MethodDefinition",
476 Self::ClassDefinition => "ClassDefinition",
477 Self::ModuleDefinition => "ModuleDefinition",
478 Self::IfStatement => "IfStatement",
479 Self::WhileStatement => "WhileStatement",
480 Self::ReturnStatement => "ReturnStatement",
481 Self::IfExpression => "IfExpression",
482 Self::CallExpression => "CallExpression",
483 Self::MemberAccess => "MemberAccess",
484 Self::ParameterList => "ParameterList",
485 Self::ArgumentList => "ArgumentList",
486 Self::Error => "Error",
487 Self::Equal => "Equal",
488 };
489 write!(f, "{}", name)
490 }
491}
492
493impl TokenType for RubyTokenType {
494 type Role = UniversalTokenRole;
495 const END_OF_STREAM: Self = Self::Error;
496
497 fn is_ignored(&self) -> bool {
498 false
499 }
500
501 fn role(&self) -> Self::Role {
502 match self {
503 _ => UniversalTokenRole::None,
504 }
505 }
506}