oak_ruby/kind/
mod.rs

1use core::fmt;
2use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
3use serde::Serialize;
4
5/// Ruby 令牌种类
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Hash)]
7pub enum RubySyntaxKind {
8    // 基础标识符和字面量
9    Identifier,
10    GlobalVariable,
11    InstanceVariable,
12    ClassVariable,
13    Constant,
14    IntegerLiteral,
15    FloatLiteral,
16    StringLiteral,
17    Literal,
18    Symbol,
19    RegexLiteral,
20
21    // 关键字
22    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    // 操作符
68    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    // 分隔符
113    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    // 空白和注释
128    Whitespace,
129    Newline,
130    Comment,
131
132    // 特殊
133    Eof,
134    Invalid,
135
136    // 节点种类
137    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}