1use core::fmt;
2use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
3use serde::Serialize;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Hash)]
7pub enum RubySyntaxKind {
8 Identifier,
10 GlobalVariable,
11 InstanceVariable,
12 ClassVariable,
13 Constant,
14 IntegerLiteral,
15 FloatLiteral,
16 StringLiteral,
17 Literal,
18 Symbol,
19 RegexLiteral,
20
21 If,
23 Unless,
24 Elsif,
25 Else,
26 Case,
27 When,
28 Then,
29 For,
30 While,
31 Until,
32 Break,
33 Next,
34 Redo,
35 Retry,
36 Return,
37 Yield,
38 Def,
39 Class,
40 Module,
41 End,
42 Lambda,
43 Proc,
44 Begin,
45 Rescue,
46 Ensure,
47 Raise,
48 Require,
49 Load,
50 Include,
51 Extend,
52 Prepend,
53 And,
54 Or,
55 Not,
56 In,
57 True,
58 False,
59 Nil,
60 Super,
61 Self_,
62 Alias,
63 Undef,
64 Defined,
65 Do,
66
67 Plus,
69 Minus,
70 Multiply,
71 Divide,
72 Modulo,
73 Power,
74 EqualEqual,
75 NotEqual,
76 Less,
77 Greater,
78 LessEqual,
79 GreaterEqual,
80 EqualEqualEqual,
81 Spaceship,
82 Assign,
83 Equal,
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,
114 RightParen,
115 LeftBracket,
116 RightBracket,
117 LeftBrace,
118 RightBrace,
119 Comma,
120 Colon,
121 Semicolon,
122 Dot,
123 DoubleColon,
124 At,
125 Dollar,
126
127 Whitespace,
129 Newline,
130 Comment,
131
132 Eof,
134 Invalid,
135
136 Root,
138 BinaryExpression,
139 UnaryExpression,
140 LiteralExpression,
141 ParenExpression,
142 ParenthesizedExpression,
143 MethodDefinition,
144 ClassDefinition,
145 ModuleDefinition,
146 IfStatement,
147 WhileStatement,
148 ReturnStatement,
149 IfExpression,
150 CallExpression,
151 MemberAccess,
152 ParameterList,
153 ArgumentList,
154 Error,
155}
156
157impl RubySyntaxKind {
158 pub fn is_ignored(&self) -> bool {
159 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
160 }
161
162 pub fn is_keyword(&self) -> bool {
163 matches!(
164 self,
165 Self::If
166 | Self::Unless
167 | Self::Elsif
168 | Self::Else
169 | Self::Case
170 | Self::When
171 | Self::Then
172 | Self::For
173 | Self::While
174 | Self::Until
175 | Self::Break
176 | Self::Next
177 | Self::Redo
178 | Self::Retry
179 | Self::Return
180 | Self::Yield
181 | Self::Def
182 | Self::Class
183 | Self::Module
184 | Self::End
185 | Self::Lambda
186 | Self::Proc
187 | Self::Begin
188 | Self::Rescue
189 | Self::Ensure
190 | Self::Raise
191 | Self::Require
192 | Self::Load
193 | Self::Include
194 | Self::Extend
195 | Self::Prepend
196 | Self::And
197 | Self::Or
198 | Self::Not
199 | Self::In
200 | Self::True
201 | Self::False
202 | Self::Nil
203 | Self::Super
204 | Self::Self_
205 | Self::Alias
206 | Self::Undef
207 | Self::Defined
208 | Self::Do
209 )
210 }
211}
212
213impl TokenType for RubySyntaxKind {
214 const END_OF_STREAM: Self = Self::Eof;
215 type Role = UniversalTokenRole;
216
217 fn role(&self) -> Self::Role {
218 match self {
219 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
220 Self::Comment => UniversalTokenRole::Comment,
221 Self::Identifier | Self::GlobalVariable | Self::InstanceVariable | Self::ClassVariable | Self::Constant => UniversalTokenRole::Name,
222 Self::IntegerLiteral | Self::FloatLiteral | Self::StringLiteral | Self::Literal | Self::Symbol | Self::RegexLiteral => UniversalTokenRole::Literal,
223 _ if self.is_keyword() => UniversalTokenRole::Keyword,
224 Self::Plus
225 | Self::Minus
226 | Self::Multiply
227 | Self::Divide
228 | Self::Modulo
229 | Self::Power
230 | Self::EqualEqual
231 | Self::NotEqual
232 | Self::Less
233 | Self::Greater
234 | Self::LessEqual
235 | Self::GreaterEqual
236 | Self::EqualEqualEqual
237 | Self::Spaceship
238 | Self::Assign
239 | Self::PlusAssign
240 | Self::MinusAssign
241 | Self::MultiplyAssign
242 | Self::DivideAssign
243 | Self::ModuloAssign
244 | Self::PowerAssign
245 | Self::BitAnd
246 | Self::BitOr
247 | Self::Xor
248 | Self::LogicalNot
249 | Self::Tilde
250 | Self::LeftShift
251 | Self::RightShift
252 | Self::AndAssign
253 | Self::OrAssign
254 | Self::XorAssign
255 | Self::LeftShiftAssign
256 | Self::RightShiftAssign
257 | Self::AndAnd
258 | Self::OrOr
259 | Self::OrOrAssign
260 | Self::AndAndAssign
261 | Self::Question
262 | Self::DotDot
263 | Self::DotDotDot
264 | Self::Match
265 | Self::NotMatch => UniversalTokenRole::Operator,
266 Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace | Self::Comma | Self::Colon | Self::Semicolon | Self::Dot | Self::DoubleColon | Self::At | Self::Dollar => {
267 UniversalTokenRole::Punctuation
268 }
269 Self::Eof => UniversalTokenRole::Eof,
270 _ => UniversalTokenRole::None,
271 }
272 }
273
274 fn is_comment(&self) -> bool {
275 matches!(self, Self::Comment)
276 }
277
278 fn is_whitespace(&self) -> bool {
279 matches!(self, Self::Whitespace | Self::Newline)
280 }
281}
282
283impl ElementType for RubySyntaxKind {
284 type Role = UniversalElementRole;
285
286 fn role(&self) -> Self::Role {
287 match self {
288 Self::Root => UniversalElementRole::Root,
289 Self::BinaryExpression | Self::UnaryExpression | Self::LiteralExpression | Self::ParenExpression => UniversalElementRole::Expression,
290 _ => UniversalElementRole::None,
291 }
292 }
293
294 fn is_error(&self) -> bool {
295 matches!(self, Self::Invalid)
296 }
297}
298
299impl fmt::Display for RubySyntaxKind {
300 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
301 let name = match self {
302 Self::Identifier => "Identifier",
303 Self::GlobalVariable => "GlobalVariable",
304 Self::InstanceVariable => "InstanceVariable",
305 Self::ClassVariable => "ClassVariable",
306 Self::Constant => "Constant",
307 Self::IntegerLiteral => "IntegerLiteral",
308 Self::FloatLiteral => "FloatLiteral",
309 Self::StringLiteral => "StringLiteral",
310 Self::Literal => "Literal",
311 Self::Symbol => "Symbol",
312 Self::RegexLiteral => "RegexLiteral",
313
314 Self::If => "If",
315 Self::Unless => "Unless",
316 Self::Elsif => "Elsif",
317 Self::Else => "Else",
318 Self::Case => "Case",
319 Self::When => "When",
320 Self::Then => "Then",
321 Self::For => "For",
322 Self::While => "While",
323 Self::Until => "Until",
324 Self::Break => "Break",
325 Self::Next => "Next",
326 Self::Redo => "Redo",
327 Self::Retry => "Retry",
328 Self::Return => "Return",
329 Self::Yield => "Yield",
330 Self::Def => "Def",
331 Self::Class => "Class",
332 Self::Module => "Module",
333 Self::End => "End",
334 Self::Lambda => "Lambda",
335 Self::Proc => "Proc",
336 Self::Begin => "Begin",
337 Self::Rescue => "Rescue",
338 Self::Ensure => "Ensure",
339 Self::Raise => "Raise",
340 Self::Require => "Require",
341 Self::Load => "Load",
342 Self::Include => "Include",
343 Self::Extend => "Extend",
344 Self::Prepend => "Prepend",
345 Self::And => "And",
346 Self::Or => "Or",
347 Self::Not => "Not",
348 Self::In => "In",
349 Self::True => "True",
350 Self::False => "False",
351 Self::Nil => "Nil",
352 Self::Super => "Super",
353 Self::Self_ => "Self",
354 Self::Alias => "Alias",
355 Self::Undef => "Undef",
356 Self::Defined => "Defined",
357 Self::Do => "Do",
358
359 Self::Plus => "Plus",
360 Self::Minus => "Minus",
361 Self::Multiply => "Multiply",
362 Self::Divide => "Divide",
363 Self::Modulo => "Modulo",
364 Self::Power => "Power",
365 Self::EqualEqual => "EqualEqual",
366 Self::NotEqual => "NotEqual",
367 Self::Less => "Less",
368 Self::Greater => "Greater",
369 Self::LessEqual => "LessEqual",
370 Self::GreaterEqual => "GreaterEqual",
371 Self::EqualEqualEqual => "EqualEqualEqual",
372 Self::Spaceship => "Spaceship",
373 Self::Assign => "Assign",
374 Self::PlusAssign => "PlusAssign",
375 Self::MinusAssign => "MinusAssign",
376 Self::MultiplyAssign => "MultiplyAssign",
377 Self::DivideAssign => "DivideAssign",
378 Self::ModuloAssign => "ModuloAssign",
379 Self::PowerAssign => "PowerAssign",
380 Self::BitAnd => "BitAnd",
381 Self::BitOr => "BitOr",
382 Self::Xor => "Xor",
383 Self::LogicalNot => "LogicalNot",
384 Self::Tilde => "Tilde",
385 Self::LeftShift => "LeftShift",
386 Self::RightShift => "RightShift",
387 Self::AndAssign => "AndAssign",
388 Self::OrAssign => "OrAssign",
389 Self::XorAssign => "XorAssign",
390 Self::LeftShiftAssign => "LeftShiftAssign",
391 Self::RightShiftAssign => "RightShiftAssign",
392 Self::AndAnd => "AndAnd",
393 Self::OrOr => "OrOr",
394 Self::OrOrAssign => "OrOrAssign",
395 Self::AndAndAssign => "AndAndAssign",
396 Self::Question => "Question",
397 Self::DotDot => "DotDot",
398 Self::DotDotDot => "DotDotDot",
399 Self::Match => "Match",
400 Self::NotMatch => "NotMatch",
401
402 Self::LeftParen => "LeftParen",
403 Self::RightParen => "RightParen",
404 Self::LeftBracket => "LeftBracket",
405 Self::RightBracket => "RightBracket",
406 Self::LeftBrace => "LeftBrace",
407 Self::RightBrace => "RightBrace",
408 Self::Comma => "Comma",
409 Self::Colon => "Colon",
410 Self::Semicolon => "Semicolon",
411 Self::Dot => "Dot",
412 Self::DoubleColon => "DoubleColon",
413 Self::At => "At",
414 Self::Dollar => "Dollar",
415
416 Self::Whitespace => "Whitespace",
417 Self::Newline => "Newline",
418 Self::Comment => "Comment",
419 Self::Eof => "Eof",
420 Self::Invalid => "Invalid",
421 Self::Root => "Root",
422 Self::BinaryExpression => "BinaryExpression",
423 Self::UnaryExpression => "UnaryExpression",
424 Self::LiteralExpression => "LiteralExpression",
425 Self::ParenExpression => "ParenExpression",
426 Self::ParenthesizedExpression => "ParenthesizedExpression",
427 Self::MethodDefinition => "MethodDefinition",
428 Self::ClassDefinition => "ClassDefinition",
429 Self::ModuleDefinition => "ModuleDefinition",
430 Self::IfStatement => "IfStatement",
431 Self::WhileStatement => "WhileStatement",
432 Self::ReturnStatement => "ReturnStatement",
433 Self::IfExpression => "IfExpression",
434 Self::CallExpression => "CallExpression",
435 Self::MemberAccess => "MemberAccess",
436 Self::ParameterList => "ParameterList",
437 Self::ArgumentList => "ArgumentList",
438 Self::Error => "Error",
439 Self::Equal => "Equal",
440 };
441 write!(f, "{}", name)
442 }
443}