1use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3use std::fmt;
4
5pub type RubyToken = Token<RubyTokenType>;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11#[repr(u8)]
12pub enum RubyTokenType {
13 Identifier,
15 GlobalVariable,
17 InstanceVariable,
19 ClassVariable,
21 Constant,
23 IntegerLiteral,
25 FloatLiteral,
27 StringLiteral,
29 Literal,
31 Symbol,
33 RegexLiteral,
35
36 If,
38 Unless,
40 Elsif,
42 Else,
44 Case,
46 When,
48 Then,
50 For,
52 While,
54 Until,
56 Break,
58 Next,
60 Redo,
62 Retry,
64 Return,
66 Yield,
68 Def,
70 Class,
72 Module,
74 End,
76 Lambda,
78 Proc,
80 Begin,
82 Rescue,
84 Ensure,
86 Raise,
88 Require,
90 Load,
92 Include,
94 Extend,
96 Prepend,
98 And,
100 Or,
102 EqualGreater,
104 Not,
106 In,
108 True,
110 False,
112 Nil,
114 Super,
116 Self_,
118 Alias,
120 Undef,
122 Defined,
124 Do,
126
127 Plus,
129 Minus,
131 Multiply,
133 Divide,
135 Modulo,
137 Power,
139 EqualEqual,
141 NotEqual,
143 Less,
145 Greater,
147 LessEqual,
149 GreaterEqual,
151 EqualEqualEqual,
153 Spaceship,
155 Assign,
157 PlusAssign,
159 MinusAssign,
161 MultiplyAssign,
163 DivideAssign,
165 ModuloAssign,
167 PowerAssign,
169 BitAnd,
171 BitOr,
173 Xor,
175 LogicalNot,
177 Tilde,
179 LeftShift,
181 RightShift,
183 AndAssign,
185 OrAssign,
187 XorAssign,
189 LeftShiftAssign,
191 RightShiftAssign,
193 AndAnd,
195 OrOr,
197 OrOrAssign,
199 AndAndAssign,
201 Question,
203 DotDot,
205 DotDotDot,
207 Match,
209 NotMatch,
211
212 LeftParen,
214 RightParen,
216 LeftBracket,
218 RightBracket,
220 LeftBrace,
222 RightBrace,
224 Comma,
226 Colon,
228 Semicolon,
230 Dot,
232 DoubleColon,
234 At,
236 Dollar,
238
239 Whitespace,
241 Newline,
243 Comment,
245 Eof,
247 Invalid,
249 Root,
251 BinaryExpression,
253 UnaryExpression,
255 LiteralExpression,
257 ParenExpression,
259 ParenthesizedExpression,
261 MethodDefinition,
263 ClassDefinition,
265 ModuleDefinition,
267 IfStatement,
269 WhileStatement,
271 ReturnStatement,
273 IfExpression,
275 CallExpression,
277 MemberAccess,
279 ParameterList,
281 ArgumentList,
283 Error,
285 Equal,
287}
288
289impl RubyTokenType {
290 pub fn is_ignored(&self) -> bool {
292 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
293 }
294
295 pub fn is_keyword(&self) -> bool {
297 matches!(
298 self,
299 Self::If
300 | Self::Unless
301 | Self::Elsif
302 | Self::Else
303 | Self::Case
304 | Self::When
305 | Self::Then
306 | Self::For
307 | Self::While
308 | Self::Until
309 | Self::Break
310 | Self::Next
311 | Self::Redo
312 | Self::Retry
313 | Self::Return
314 | Self::Yield
315 | Self::Def
316 | Self::Class
317 | Self::Module
318 | Self::End
319 | Self::Lambda
320 | Self::Proc
321 | Self::Begin
322 | Self::Rescue
323 | Self::Ensure
324 | Self::Raise
325 | Self::Require
326 | Self::Load
327 | Self::Include
328 | Self::Extend
329 | Self::Prepend
330 | Self::And
331 | Self::Or
332 | Self::Not
333 | Self::In
334 | Self::True
335 | Self::False
336 | Self::Nil
337 | Self::Super
338 | Self::Self_
339 | Self::Alias
340 | Self::Undef
341 | Self::Defined
342 | Self::Do
343 )
344 }
345}
346
347impl fmt::Display for RubyTokenType {
348 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
349 let name = match self {
350 Self::Identifier => "Identifier",
351 Self::GlobalVariable => "GlobalVariable",
352 Self::InstanceVariable => "InstanceVariable",
353 Self::ClassVariable => "ClassVariable",
354 Self::Constant => "Constant",
355 Self::IntegerLiteral => "IntegerLiteral",
356 Self::FloatLiteral => "FloatLiteral",
357 Self::StringLiteral => "StringLiteral",
358 Self::Literal => "Literal",
359 Self::Symbol => "Symbol",
360 Self::RegexLiteral => "RegexLiteral",
361
362 Self::If => "If",
363 Self::Unless => "Unless",
364 Self::Elsif => "Elsif",
365 Self::Else => "Else",
366 Self::Case => "Case",
367 Self::When => "When",
368 Self::Then => "Then",
369 Self::For => "For",
370 Self::While => "While",
371 Self::Until => "Until",
372 Self::Break => "Break",
373 Self::Next => "Next",
374 Self::Redo => "Redo",
375 Self::Retry => "Retry",
376 Self::Return => "Return",
377 Self::Yield => "Yield",
378 Self::Def => "Def",
379 Self::Class => "Class",
380 Self::Module => "Module",
381 Self::End => "End",
382 Self::Lambda => "Lambda",
383 Self::Proc => "Proc",
384 Self::Begin => "Begin",
385 Self::Rescue => "Rescue",
386 Self::Ensure => "Ensure",
387 Self::Raise => "Raise",
388 Self::Require => "Require",
389 Self::Load => "Load",
390 Self::Include => "Include",
391 Self::Extend => "Extend",
392 Self::Prepend => "Prepend",
393 Self::And => "And",
394 Self::Or => "Or",
395 Self::Not => "Not",
396 Self::In => "In",
397 Self::True => "True",
398 Self::False => "False",
399 Self::Nil => "Nil",
400 Self::Super => "Super",
401 Self::Self_ => "Self",
402 Self::Alias => "Alias",
403 Self::Undef => "Undef",
404 Self::Defined => "Defined",
405 Self::Do => "Do",
406
407 Self::Plus => "Plus",
408 Self::Minus => "Minus",
409 Self::Multiply => "Multiply",
410 Self::Divide => "Divide",
411 Self::Modulo => "Modulo",
412 Self::Power => "Power",
413 Self::EqualEqual => "EqualEqual",
414 Self::EqualGreater => "EqualGreater",
415 Self::NotEqual => "NotEqual",
416 Self::Less => "Less",
417 Self::Greater => "Greater",
418 Self::LessEqual => "LessEqual",
419 Self::GreaterEqual => "GreaterEqual",
420 Self::EqualEqualEqual => "EqualEqualEqual",
421 Self::Spaceship => "Spaceship",
422 Self::Assign => "Assign",
423 Self::PlusAssign => "PlusAssign",
424 Self::MinusAssign => "MinusAssign",
425 Self::MultiplyAssign => "MultiplyAssign",
426 Self::DivideAssign => "DivideAssign",
427 Self::ModuloAssign => "ModuloAssign",
428 Self::PowerAssign => "PowerAssign",
429 Self::BitAnd => "BitAnd",
430 Self::BitOr => "BitOr",
431 Self::Xor => "Xor",
432 Self::LogicalNot => "LogicalNot",
433 Self::Tilde => "Tilde",
434 Self::LeftShift => "LeftShift",
435 Self::RightShift => "RightShift",
436 Self::AndAssign => "AndAssign",
437 Self::OrAssign => "OrAssign",
438 Self::XorAssign => "XorAssign",
439 Self::LeftShiftAssign => "LeftShiftAssign",
440 Self::RightShiftAssign => "RightShiftAssign",
441 Self::AndAnd => "AndAnd",
442 Self::OrOr => "OrOr",
443 Self::OrOrAssign => "OrOrAssign",
444 Self::AndAndAssign => "AndAndAssign",
445 Self::Question => "Question",
446 Self::DotDot => "DotDot",
447 Self::DotDotDot => "DotDotDot",
448 Self::Match => "Match",
449 Self::NotMatch => "NotMatch",
450
451 Self::LeftParen => "LeftParen",
452 Self::RightParen => "RightParen",
453 Self::LeftBracket => "LeftBracket",
454 Self::RightBracket => "RightBracket",
455 Self::LeftBrace => "LeftBrace",
456 Self::RightBrace => "RightBrace",
457 Self::Comma => "Comma",
458 Self::Colon => "Colon",
459 Self::Semicolon => "Semicolon",
460 Self::Dot => "Dot",
461 Self::DoubleColon => "DoubleColon",
462 Self::At => "At",
463 Self::Dollar => "Dollar",
464
465 Self::Whitespace => "Whitespace",
466 Self::Newline => "Newline",
467 Self::Comment => "Comment",
468 Self::Eof => "Eof",
469 Self::Invalid => "Invalid",
470 Self::Root => "Root",
471 Self::BinaryExpression => "BinaryExpression",
472 Self::UnaryExpression => "UnaryExpression",
473 Self::LiteralExpression => "LiteralExpression",
474 Self::ParenExpression => "ParenExpression",
475 Self::ParenthesizedExpression => "ParenthesizedExpression",
476 Self::MethodDefinition => "MethodDefinition",
477 Self::ClassDefinition => "ClassDefinition",
478 Self::ModuleDefinition => "ModuleDefinition",
479 Self::IfStatement => "IfStatement",
480 Self::WhileStatement => "WhileStatement",
481 Self::ReturnStatement => "ReturnStatement",
482 Self::IfExpression => "IfExpression",
483 Self::CallExpression => "CallExpression",
484 Self::MemberAccess => "MemberAccess",
485 Self::ParameterList => "ParameterList",
486 Self::ArgumentList => "ArgumentList",
487 Self::Error => "Error",
488 Self::Equal => "Equal",
489 };
490 write!(f, "{}", name)
491 }
492}
493
494impl TokenType for RubyTokenType {
495 type Role = UniversalTokenRole;
496 const END_OF_STREAM: Self = Self::Error;
497
498 fn is_ignored(&self) -> bool {
499 false
500 }
501
502 fn role(&self) -> Self::Role {
503 match self {
504 _ => UniversalTokenRole::None,
505 }
506 }
507}