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