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