Skip to main content

oak_ruby/lexer/
token_type.rs

1use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4use std::fmt;
5
6pub type RubyToken = Token<RubyTokenType>;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10#[repr(u8)]
11pub enum RubyTokenType {
12    Identifier,
13    GlobalVariable,
14    InstanceVariable,
15    ClassVariable,
16    Constant,
17    IntegerLiteral,
18    FloatLiteral,
19    StringLiteral,
20    Literal,
21    Symbol,
22    RegexLiteral,
23
24    If,
25    Unless,
26    Elsif,
27    Else,
28    Case,
29    When,
30    Then,
31    For,
32    While,
33    Until,
34    Break,
35    Next,
36    Redo,
37    Retry,
38    Return,
39    Yield,
40    Def,
41    Class,
42    Module,
43    End,
44    Lambda,
45    Proc,
46    Begin,
47    Rescue,
48    Ensure,
49    Raise,
50    Require,
51    Load,
52    Include,
53    Extend,
54    Prepend,
55    And,
56    Or,
57    Not,
58    In,
59    True,
60    False,
61    Nil,
62    Super,
63    Self_,
64    Alias,
65    Undef,
66    Defined,
67    Do,
68
69    Plus,
70    Minus,
71    Multiply,
72    Divide,
73    Modulo,
74    Power,
75    EqualEqual,
76    NotEqual,
77    Less,
78    Greater,
79    LessEqual,
80    GreaterEqual,
81    EqualEqualEqual,
82    Spaceship,
83    Assign,
84    PlusAssign,
85    MinusAssign,
86    MultiplyAssign,
87    DivideAssign,
88    ModuloAssign,
89    PowerAssign,
90    BitAnd,
91    BitOr,
92    Xor,
93    LogicalNot,
94    Tilde,
95    LeftShift,
96    RightShift,
97    AndAssign,
98    OrAssign,
99    XorAssign,
100    LeftShiftAssign,
101    RightShiftAssign,
102    AndAnd,
103    OrOr,
104    OrOrAssign,
105    AndAndAssign,
106    Question,
107    DotDot,
108    DotDotDot,
109    Match,
110    NotMatch,
111
112    LeftParen,
113    RightParen,
114    LeftBracket,
115    RightBracket,
116    LeftBrace,
117    RightBrace,
118    Comma,
119    Colon,
120    Semicolon,
121    Dot,
122    DoubleColon,
123    At,
124    Dollar,
125
126    Whitespace,
127    Newline,
128    Comment,
129    Eof,
130    Invalid,
131    Root,
132    BinaryExpression,
133    UnaryExpression,
134    LiteralExpression,
135    ParenExpression,
136    ParenthesizedExpression,
137    MethodDefinition,
138    ClassDefinition,
139    ModuleDefinition,
140    IfStatement,
141    WhileStatement,
142    ReturnStatement,
143    IfExpression,
144    CallExpression,
145    MemberAccess,
146    ParameterList,
147    ArgumentList,
148    Error,
149    Equal,
150}
151
152impl RubyTokenType {
153    pub fn is_ignored(&self) -> bool {
154        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
155    }
156
157    pub fn is_keyword(&self) -> bool {
158        matches!(
159            self,
160            Self::If
161                | Self::Unless
162                | Self::Elsif
163                | Self::Else
164                | Self::Case
165                | Self::When
166                | Self::Then
167                | Self::For
168                | Self::While
169                | Self::Until
170                | Self::Break
171                | Self::Next
172                | Self::Redo
173                | Self::Retry
174                | Self::Return
175                | Self::Yield
176                | Self::Def
177                | Self::Class
178                | Self::Module
179                | Self::End
180                | Self::Lambda
181                | Self::Proc
182                | Self::Begin
183                | Self::Rescue
184                | Self::Ensure
185                | Self::Raise
186                | Self::Require
187                | Self::Load
188                | Self::Include
189                | Self::Extend
190                | Self::Prepend
191                | Self::And
192                | Self::Or
193                | Self::Not
194                | Self::In
195                | Self::True
196                | Self::False
197                | Self::Nil
198                | Self::Super
199                | Self::Self_
200                | Self::Alias
201                | Self::Undef
202                | Self::Defined
203                | Self::Do
204        )
205    }
206}
207
208impl fmt::Display for RubyTokenType {
209    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
210        let name = match self {
211            Self::Identifier => "Identifier",
212            Self::GlobalVariable => "GlobalVariable",
213            Self::InstanceVariable => "InstanceVariable",
214            Self::ClassVariable => "ClassVariable",
215            Self::Constant => "Constant",
216            Self::IntegerLiteral => "IntegerLiteral",
217            Self::FloatLiteral => "FloatLiteral",
218            Self::StringLiteral => "StringLiteral",
219            Self::Literal => "Literal",
220            Self::Symbol => "Symbol",
221            Self::RegexLiteral => "RegexLiteral",
222
223            Self::If => "If",
224            Self::Unless => "Unless",
225            Self::Elsif => "Elsif",
226            Self::Else => "Else",
227            Self::Case => "Case",
228            Self::When => "When",
229            Self::Then => "Then",
230            Self::For => "For",
231            Self::While => "While",
232            Self::Until => "Until",
233            Self::Break => "Break",
234            Self::Next => "Next",
235            Self::Redo => "Redo",
236            Self::Retry => "Retry",
237            Self::Return => "Return",
238            Self::Yield => "Yield",
239            Self::Def => "Def",
240            Self::Class => "Class",
241            Self::Module => "Module",
242            Self::End => "End",
243            Self::Lambda => "Lambda",
244            Self::Proc => "Proc",
245            Self::Begin => "Begin",
246            Self::Rescue => "Rescue",
247            Self::Ensure => "Ensure",
248            Self::Raise => "Raise",
249            Self::Require => "Require",
250            Self::Load => "Load",
251            Self::Include => "Include",
252            Self::Extend => "Extend",
253            Self::Prepend => "Prepend",
254            Self::And => "And",
255            Self::Or => "Or",
256            Self::Not => "Not",
257            Self::In => "In",
258            Self::True => "True",
259            Self::False => "False",
260            Self::Nil => "Nil",
261            Self::Super => "Super",
262            Self::Self_ => "Self",
263            Self::Alias => "Alias",
264            Self::Undef => "Undef",
265            Self::Defined => "Defined",
266            Self::Do => "Do",
267
268            Self::Plus => "Plus",
269            Self::Minus => "Minus",
270            Self::Multiply => "Multiply",
271            Self::Divide => "Divide",
272            Self::Modulo => "Modulo",
273            Self::Power => "Power",
274            Self::EqualEqual => "EqualEqual",
275            Self::NotEqual => "NotEqual",
276            Self::Less => "Less",
277            Self::Greater => "Greater",
278            Self::LessEqual => "LessEqual",
279            Self::GreaterEqual => "GreaterEqual",
280            Self::EqualEqualEqual => "EqualEqualEqual",
281            Self::Spaceship => "Spaceship",
282            Self::Assign => "Assign",
283            Self::PlusAssign => "PlusAssign",
284            Self::MinusAssign => "MinusAssign",
285            Self::MultiplyAssign => "MultiplyAssign",
286            Self::DivideAssign => "DivideAssign",
287            Self::ModuloAssign => "ModuloAssign",
288            Self::PowerAssign => "PowerAssign",
289            Self::BitAnd => "BitAnd",
290            Self::BitOr => "BitOr",
291            Self::Xor => "Xor",
292            Self::LogicalNot => "LogicalNot",
293            Self::Tilde => "Tilde",
294            Self::LeftShift => "LeftShift",
295            Self::RightShift => "RightShift",
296            Self::AndAssign => "AndAssign",
297            Self::OrAssign => "OrAssign",
298            Self::XorAssign => "XorAssign",
299            Self::LeftShiftAssign => "LeftShiftAssign",
300            Self::RightShiftAssign => "RightShiftAssign",
301            Self::AndAnd => "AndAnd",
302            Self::OrOr => "OrOr",
303            Self::OrOrAssign => "OrOrAssign",
304            Self::AndAndAssign => "AndAndAssign",
305            Self::Question => "Question",
306            Self::DotDot => "DotDot",
307            Self::DotDotDot => "DotDotDot",
308            Self::Match => "Match",
309            Self::NotMatch => "NotMatch",
310
311            Self::LeftParen => "LeftParen",
312            Self::RightParen => "RightParen",
313            Self::LeftBracket => "LeftBracket",
314            Self::RightBracket => "RightBracket",
315            Self::LeftBrace => "LeftBrace",
316            Self::RightBrace => "RightBrace",
317            Self::Comma => "Comma",
318            Self::Colon => "Colon",
319            Self::Semicolon => "Semicolon",
320            Self::Dot => "Dot",
321            Self::DoubleColon => "DoubleColon",
322            Self::At => "At",
323            Self::Dollar => "Dollar",
324
325            Self::Whitespace => "Whitespace",
326            Self::Newline => "Newline",
327            Self::Comment => "Comment",
328            Self::Eof => "Eof",
329            Self::Invalid => "Invalid",
330            Self::Root => "Root",
331            Self::BinaryExpression => "BinaryExpression",
332            Self::UnaryExpression => "UnaryExpression",
333            Self::LiteralExpression => "LiteralExpression",
334            Self::ParenExpression => "ParenExpression",
335            Self::ParenthesizedExpression => "ParenthesizedExpression",
336            Self::MethodDefinition => "MethodDefinition",
337            Self::ClassDefinition => "ClassDefinition",
338            Self::ModuleDefinition => "ModuleDefinition",
339            Self::IfStatement => "IfStatement",
340            Self::WhileStatement => "WhileStatement",
341            Self::ReturnStatement => "ReturnStatement",
342            Self::IfExpression => "IfExpression",
343            Self::CallExpression => "CallExpression",
344            Self::MemberAccess => "MemberAccess",
345            Self::ParameterList => "ParameterList",
346            Self::ArgumentList => "ArgumentList",
347            Self::Error => "Error",
348            Self::Equal => "Equal",
349        };
350        write!(f, "{}", name)
351    }
352}
353
354impl TokenType for RubyTokenType {
355    type Role = UniversalTokenRole;
356    const END_OF_STREAM: Self = Self::Error;
357
358    fn is_ignored(&self) -> bool {
359        false
360    }
361
362    fn role(&self) -> Self::Role {
363        match self {
364            _ => UniversalTokenRole::None,
365        }
366    }
367}