Skip to main content

oak_csharp/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7#[repr(u16)]
8pub enum CSharpElementType {
9    // Tokens (copied from CSharpTokenType)
10    Whitespace,
11    Newline,
12    Comment,
13    Identifier,
14    Number,
15    String,
16    Character,
17    VerbatimString,
18    InterpolatedString,
19    NumberLiteral,
20    StringLiteral,
21    CharLiteral,
22
23    // Keywords
24    Abstract,
25    As,
26    Base,
27    Bool,
28    Break,
29    Byte,
30    Case,
31    Catch,
32    Char,
33    Checked,
34    Class,
35    Const,
36    Continue,
37    Decimal,
38    Default,
39    Delegate,
40    Do,
41    Double,
42    Else,
43    Enum,
44    Event,
45    Explicit,
46    Extern,
47    False,
48    Finally,
49    Fixed,
50    Float,
51    For,
52    Foreach,
53    Goto,
54    If,
55    Implicit,
56    In,
57    Int,
58    Interface,
59    Internal,
60    Is,
61    Lock,
62    Long,
63    Namespace,
64    New,
65    Null,
66    Object,
67    Operator,
68    Out,
69    Override,
70    Params,
71    Private,
72    Protected,
73    Public,
74    Readonly,
75    Record,
76    Ref,
77    Return,
78    Sbyte,
79    Sealed,
80    Short,
81    Sizeof,
82    Stackalloc,
83    Static,
84    Struct,
85    Switch,
86    This,
87    Throw,
88    True,
89    Try,
90    Typeof,
91    Uint,
92    Ulong,
93    Unchecked,
94    Unsafe,
95    Ushort,
96    Using,
97    Virtual,
98    Void,
99    Volatile,
100    While,
101
102    // Long keyword variants
103    AbstractKeyword,
104    AsKeyword,
105    BaseKeyword,
106    BoolKeyword,
107    BreakKeyword,
108    ByteKeyword,
109    CaseKeyword,
110    CatchKeyword,
111    CharKeyword,
112    CheckedKeyword,
113    ClassKeyword,
114    ConstKeyword,
115    ContinueKeyword,
116    DecimalKeyword,
117    DefaultKeyword,
118    DelegateKeyword,
119    DoKeyword,
120    DoubleKeyword,
121    ElseKeyword,
122    EnumKeyword,
123    EventKeyword,
124    ExplicitKeyword,
125    ExternKeyword,
126    FalseKeyword,
127    FinallyKeyword,
128    FixedKeyword,
129    FloatKeyword,
130    ForKeyword,
131    ForeachKeyword,
132    GotoKeyword,
133    IfKeyword,
134    ImplicitKeyword,
135    InKeyword,
136    IntKeyword,
137    InterfaceKeyword,
138    InternalKeyword,
139    IsKeyword,
140    LockKeyword,
141    LongKeyword,
142    NamespaceKeyword,
143    NewKeyword,
144    NullKeyword,
145    ObjectKeyword,
146    OperatorKeyword,
147    OutKeyword,
148    OverrideKeyword,
149    ParamsKeyword,
150    PrivateKeyword,
151    ProtectedKeyword,
152    PublicKeyword,
153    ReadonlyKeyword,
154    RefKeyword,
155    ReturnKeyword,
156    SbyteKeyword,
157    SealedKeyword,
158    ShortKeyword,
159    SizeofKeyword,
160    StackallocKeyword,
161    StaticKeyword,
162    StringKeyword,
163    StructKeyword,
164    SwitchKeyword,
165    ThisKeyword,
166    ThrowKeyword,
167    TrueKeyword,
168    TryKeyword,
169    TypeofKeyword,
170    UintKeyword,
171    UlongKeyword,
172    UncheckedKeyword,
173    UnsafeKeyword,
174    UshortKeyword,
175    UsingKeyword,
176    VirtualKeyword,
177    VoidKeyword,
178    VolatileKeyword,
179    WhileKeyword,
180
181    // Contextual keywords
182    AddKeyword,
183    AliasKeyword,
184    AscendingKeyword,
185    ByKeyword,
186    DescendingKeyword,
187    FromKeyword,
188    GetKeyword,
189    GlobalKeyword,
190    GroupKeyword,
191    IntoKeyword,
192    JoinKeyword,
193    LetKeyword,
194    OrderbyKeyword,
195    PartialKeyword,
196    RemoveKeyword,
197    SelectKeyword,
198    SetKeyword,
199    ValueKeyword,
200    VarKeyword,
201    WhereKeyword,
202    YieldKeyword,
203
204    // Operators
205    Plus,
206    Minus,
207    Star,
208    Slash,
209    Percent,
210    Ampersand,
211    Pipe,
212    Caret,
213    Tilde,
214    BitAnd,
215    BitOr,
216    BitXor,
217    BitNot,
218    LeftShift,
219    RightShift,
220    Equal,
221    NotEqual,
222    Less,
223    LessEqual,
224    Greater,
225    GreaterEqual,
226    LogicalAnd,
227    LogicalOr,
228    LogicalNot,
229    Question,
230    QuestionQuestion,
231    Increment,
232    Decrement,
233    Arrow,
234    Lambda,
235
236    // Assignment operators
237    Assign,
238    PlusAssign,
239    MinusAssign,
240    StarAssign,
241    SlashAssign,
242    PercentAssign,
243    AmpersandAssign,
244    PipeAssign,
245    CaretAssign,
246    LeftShiftAssign,
247    RightShiftAssign,
248    QuestionQuestionAssign,
249    AndAssign,
250    OrAssign,
251    XorAssign,
252
253    // Delimiters
254    LeftParen,
255    RightParen,
256    LeftBracket,
257    RightBracket,
258    LeftBrace,
259    RightBrace,
260    Comma,
261    Semicolon,
262    Colon,
263    ColonColon,
264    Dot,
265    QuestionDot,
266    At,
267    Hash,
268    Dollar,
269
270    Eof,
271    Error,
272
273    // Non-terminal elements
274    IfStatement,
275    WhileStatement,
276    ForStatement,
277    Block,
278    ReturnStatement,
279    MethodDeclaration,
280    PropertyDeclaration,
281    FieldDeclaration,
282    IndexerDeclaration,
283    IdentifierName,
284    LiteralExpression,
285    BinaryExpression,
286    InvocationExpression,
287    ElementAccessExpression,
288    MemberAccessExpression,
289    AssignmentExpression,
290    BreakStatement,
291    ContinueStatement,
292    ExpressionStatement,
293    ForeachStatement,
294    NamespaceDeclaration,
295    UsingDirective,
296    ClassDeclaration,
297    InterfaceDeclaration,
298    StructDeclaration,
299    EnumDeclaration,
300    RecordDeclaration,
301    DelegateDeclaration,
302    EventDeclaration,
303    AwaitExpression,
304    AttributeList,
305    Attribute,
306    Root,
307}
308
309impl CSharpElementType {
310    pub fn is_keyword(&self) -> bool {
311        matches!(
312            self,
313            Self::Abstract
314                | Self::As
315                | Self::Base
316                | Self::Bool
317                | Self::Break
318                | Self::Byte
319                | Self::Case
320                | Self::Catch
321                | Self::Char
322                | Self::Checked
323                | Self::Class
324                | Self::Const
325                | Self::Continue
326                | Self::Decimal
327                | Self::Default
328                | Self::Delegate
329                | Self::Do
330                | Self::Double
331                | Self::Else
332                | Self::Enum
333                | Self::Event
334                | Self::Explicit
335                | Self::Extern
336                | Self::False
337                | Self::Finally
338                | Self::Fixed
339                | Self::Float
340                | Self::For
341                | Self::Foreach
342                | Self::Goto
343                | Self::If
344                | Self::Implicit
345                | Self::In
346                | Self::Int
347                | Self::Interface
348                | Self::Internal
349                | Self::Is
350                | Self::Lock
351                | Self::Long
352                | Self::Namespace
353                | Self::New
354                | Self::Null
355                | Self::Object
356                | Self::Operator
357                | Self::Out
358                | Self::Override
359                | Self::Params
360                | Self::Private
361                | Self::Protected
362                | Self::Public
363                | Self::Readonly
364                | Self::Ref
365                | Self::Return
366                | Self::Sbyte
367                | Self::Sealed
368                | Self::Short
369                | Self::Sizeof
370                | Self::Stackalloc
371                | Self::Static
372                | Self::Struct
373                | Self::Switch
374                | Self::This
375                | Self::Throw
376                | Self::True
377                | Self::Try
378                | Self::Typeof
379                | Self::Uint
380                | Self::Ulong
381                | Self::Unchecked
382                | Self::Unsafe
383                | Self::Ushort
384                | Self::Using
385                | Self::Virtual
386                | Self::Void
387                | Self::Volatile
388                | Self::While
389                | Self::AbstractKeyword
390                | Self::AsKeyword
391                | Self::BaseKeyword
392                | Self::BoolKeyword
393                | Self::BreakKeyword
394                | Self::ByteKeyword
395                | Self::CaseKeyword
396                | Self::CatchKeyword
397                | Self::CharKeyword
398                | Self::CheckedKeyword
399                | Self::ClassKeyword
400                | Self::ConstKeyword
401                | Self::ContinueKeyword
402                | Self::DecimalKeyword
403                | Self::DefaultKeyword
404                | Self::DelegateKeyword
405                | Self::DoKeyword
406                | Self::DoubleKeyword
407                | Self::ElseKeyword
408                | Self::EnumKeyword
409                | Self::EventKeyword
410                | Self::ExplicitKeyword
411                | Self::ExternKeyword
412                | Self::FalseKeyword
413                | Self::FinallyKeyword
414                | Self::FixedKeyword
415                | Self::FloatKeyword
416                | Self::ForKeyword
417                | Self::ForeachKeyword
418                | Self::GotoKeyword
419                | Self::IfKeyword
420                | Self::ImplicitKeyword
421                | Self::InKeyword
422                | Self::IntKeyword
423                | Self::InterfaceKeyword
424                | Self::InternalKeyword
425                | Self::IsKeyword
426                | Self::LockKeyword
427                | Self::LongKeyword
428                | Self::NamespaceKeyword
429                | Self::NewKeyword
430                | Self::NullKeyword
431                | Self::ObjectKeyword
432                | Self::OperatorKeyword
433                | Self::OutKeyword
434                | Self::OverrideKeyword
435                | Self::ParamsKeyword
436                | Self::PrivateKeyword
437                | Self::ProtectedKeyword
438                | Self::PublicKeyword
439                | Self::ReadonlyKeyword
440                | Self::RefKeyword
441                | Self::ReturnKeyword
442                | Self::SbyteKeyword
443                | Self::SealedKeyword
444                | Self::ShortKeyword
445                | Self::SizeofKeyword
446                | Self::StackallocKeyword
447                | Self::StaticKeyword
448                | Self::StringKeyword
449                | Self::StructKeyword
450                | Self::SwitchKeyword
451                | Self::ThisKeyword
452                | Self::ThrowKeyword
453                | Self::TrueKeyword
454                | Self::TryKeyword
455                | Self::TypeofKeyword
456                | Self::UintKeyword
457                | Self::UlongKeyword
458                | Self::UncheckedKeyword
459                | Self::UnsafeKeyword
460                | Self::UshortKeyword
461                | Self::UsingKeyword
462                | Self::VirtualKeyword
463                | Self::VoidKeyword
464                | Self::VolatileKeyword
465                | Self::WhileKeyword
466                | Self::AddKeyword
467                | Self::AliasKeyword
468                | Self::AscendingKeyword
469                | Self::ByKeyword
470                | Self::DescendingKeyword
471                | Self::FromKeyword
472                | Self::GetKeyword
473                | Self::GlobalKeyword
474                | Self::GroupKeyword
475                | Self::IntoKeyword
476                | Self::JoinKeyword
477                | Self::LetKeyword
478                | Self::OrderbyKeyword
479                | Self::PartialKeyword
480                | Self::RemoveKeyword
481                | Self::SelectKeyword
482                | Self::SetKeyword
483                | Self::ValueKeyword
484                | Self::VarKeyword
485                | Self::WhereKeyword
486                | Self::YieldKeyword
487        )
488    }
489}
490
491impl ElementType for CSharpElementType {
492    type Role = UniversalElementRole;
493
494    fn role(&self) -> Self::Role {
495        match self {
496            _ => UniversalElementRole::None,
497        }
498    }
499}
500
501impl From<crate::lexer::token_type::CSharpTokenType> for CSharpElementType {
502    fn from(token: crate::lexer::token_type::CSharpTokenType) -> Self {
503        unsafe { std::mem::transmute(token as u16) }
504    }
505}