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/// Element types for the C# parser.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8#[repr(u16)]
9pub enum CSharpElementType {
10    // Tokens (copied from CSharpTokenType)
11    /// Whitespace characters.
12    Whitespace,
13    /// Line breaks.
14    Newline,
15    /// Comments.
16    Comment,
17    /// An identifier.
18    Identifier,
19    /// A numeric literal.
20    Number,
21    /// A string literal.
22    String,
23    /// A character literal.
24    Character,
25    /// A verbatim string literal (e.g., `@"..."`).
26    VerbatimString,
27    /// An interpolated string literal (e.g., `$"..."`).
28    InterpolatedString,
29    /// A number literal (generic).
30    NumberLiteral,
31    /// A string literal (generic).
32    StringLiteral,
33    /// A character literal (generic).
34    CharLiteral,
35
36    // Keywords
37    /// The `abstract` keyword.
38    Abstract,
39    /// The `as` keyword.
40    As,
41    /// The `base` keyword.
42    Base,
43    /// The `bool` keyword.
44    Bool,
45    /// The `break` keyword.
46    Break,
47    /// The `byte` keyword.
48    Byte,
49    /// The `case` keyword.
50    Case,
51    /// The `catch` keyword.
52    Catch,
53    /// The `char` keyword.
54    Char,
55    /// The `checked` keyword.
56    Checked,
57    /// The `class` keyword.
58    Class,
59    /// The `const` keyword.
60    Const,
61    /// The `continue` keyword.
62    Continue,
63    /// The `decimal` keyword.
64    Decimal,
65    /// The `default` keyword.
66    Default,
67    /// The `delegate` keyword.
68    Delegate,
69    /// The `do` keyword.
70    Do,
71    /// The `double` keyword.
72    Double,
73    /// The `else` keyword.
74    Else,
75    /// The `enum` keyword.
76    Enum,
77    /// The `event` keyword.
78    Event,
79    /// The `explicit` keyword.
80    Explicit,
81    /// The `extern` keyword.
82    Extern,
83    /// The `false` keyword.
84    False,
85    /// The `finally` keyword.
86    Finally,
87    /// The `fixed` keyword.
88    Fixed,
89    /// The `float` keyword.
90    Float,
91    /// The `for` keyword.
92    For,
93    /// The `foreach` keyword.
94    Foreach,
95    /// The `goto` keyword.
96    Goto,
97    /// The `if` keyword.
98    If,
99    /// The `implicit` keyword.
100    Implicit,
101    /// The `in` keyword.
102    In,
103    /// The `int` keyword.
104    Int,
105    /// The `interface` keyword.
106    Interface,
107    /// The `internal` keyword.
108    Internal,
109    /// The `is` keyword.
110    Is,
111    /// The `lock` keyword.
112    Lock,
113    /// The `long` keyword.
114    Long,
115    /// The `namespace` keyword.
116    Namespace,
117    /// The `new` keyword.
118    New,
119    /// The `null` keyword.
120    Null,
121    /// The `object` keyword.
122    Object,
123    /// The `operator` keyword.
124    Operator,
125    /// The `out` keyword.
126    Out,
127    /// The `override` keyword.
128    Override,
129    /// The `params` keyword.
130    Params,
131    /// The `private` keyword.
132    Private,
133    /// The `protected` keyword.
134    Protected,
135    /// The `public` keyword.
136    Public,
137    /// The `readonly` keyword.
138    Readonly,
139    /// The `record` keyword.
140    Record,
141    /// The `ref` keyword.
142    Ref,
143    /// The `return` keyword.
144    Return,
145    /// The `sbyte` keyword.
146    Sbyte,
147    /// The `sealed` keyword.
148    Sealed,
149    /// The `short` keyword.
150    Short,
151    /// The `sizeof` keyword.
152    Sizeof,
153    /// The `stackalloc` keyword.
154    Stackalloc,
155    /// The `static` keyword.
156    Static,
157    /// The `struct` keyword.
158    Struct,
159    /// The `switch` keyword.
160    Switch,
161    /// The `this` keyword.
162    This,
163    /// The `throw` keyword.
164    Throw,
165    /// The `true` keyword.
166    True,
167    /// The `try` keyword.
168    Try,
169    /// The `typeof` keyword.
170    Typeof,
171    /// The `uint` keyword.
172    Uint,
173    /// The `ulong` keyword.
174    Ulong,
175    /// The `unchecked` keyword.
176    Unchecked,
177    /// The `unsafe` keyword.
178    Unsafe,
179    /// The `ushort` keyword.
180    Ushort,
181    /// The `using` keyword.
182    Using,
183    /// The `virtual` keyword.
184    Virtual,
185    /// The `void` keyword.
186    Void,
187    /// The `volatile` keyword.
188    Volatile,
189    /// The `while` keyword.
190    While,
191
192    // Long keyword variants
193    /// Variant of `abstract` keyword.
194    AbstractKeyword,
195    /// Variant of `as` keyword.
196    AsKeyword,
197    /// Variant of `base` keyword.
198    BaseKeyword,
199    /// Variant of `bool` keyword.
200    BoolKeyword,
201    /// Variant of `break` keyword.
202    BreakKeyword,
203    /// Variant of `byte` keyword.
204    ByteKeyword,
205    /// Variant of `case` keyword.
206    CaseKeyword,
207    /// Variant of `catch` keyword.
208    CatchKeyword,
209    /// Variant of `char` keyword.
210    CharKeyword,
211    /// Variant of `checked` keyword.
212    CheckedKeyword,
213    /// Variant of `class` keyword.
214    ClassKeyword,
215    /// Variant of `const` keyword.
216    ConstKeyword,
217    /// Variant of `continue` keyword.
218    ContinueKeyword,
219    /// Variant of `decimal` keyword.
220    DecimalKeyword,
221    /// Variant of `default` keyword.
222    DefaultKeyword,
223    /// Variant of `delegate` keyword.
224    DelegateKeyword,
225    /// Variant of `do` keyword.
226    DoKeyword,
227    /// Variant of `double` keyword.
228    DoubleKeyword,
229    /// Variant of `else` keyword.
230    ElseKeyword,
231    /// Variant of `enum` keyword.
232    EnumKeyword,
233    /// Variant of `event` keyword.
234    EventKeyword,
235    /// Variant of `explicit` keyword.
236    ExplicitKeyword,
237    /// Variant of `extern` keyword.
238    ExternKeyword,
239    /// Variant of `false` keyword.
240    FalseKeyword,
241    /// Variant of `finally` keyword.
242    FinallyKeyword,
243    /// Variant of `fixed` keyword.
244    FixedKeyword,
245    /// Variant of `float` keyword.
246    FloatKeyword,
247    /// Variant of `for` keyword.
248    ForKeyword,
249    /// Variant of `foreach` keyword.
250    ForeachKeyword,
251    /// Variant of `goto` keyword.
252    GotoKeyword,
253    /// Variant of `if` keyword.
254    IfKeyword,
255    /// Variant of `implicit` keyword.
256    ImplicitKeyword,
257    /// Variant of `in` keyword.
258    InKeyword,
259    /// Variant of `int` keyword.
260    IntKeyword,
261    /// Variant of `interface` keyword.
262    InterfaceKeyword,
263    /// Variant of `internal` keyword.
264    InternalKeyword,
265    /// Variant of `is` keyword.
266    IsKeyword,
267    /// Variant of `lock` keyword.
268    LockKeyword,
269    /// Variant of `long` keyword.
270    LongKeyword,
271    /// Variant of `namespace` keyword.
272    NamespaceKeyword,
273    /// Variant of `new` keyword.
274    NewKeyword,
275    /// Variant of `null` keyword.
276    NullKeyword,
277    /// Variant of `object` keyword.
278    ObjectKeyword,
279    /// Variant of `operator` keyword.
280    OperatorKeyword,
281    /// Variant of `out` keyword.
282    OutKeyword,
283    /// Variant of `override` keyword.
284    OverrideKeyword,
285    /// Variant of `params` keyword.
286    ParamsKeyword,
287    /// Variant of `private` keyword.
288    PrivateKeyword,
289    /// Variant of `protected` keyword.
290    ProtectedKeyword,
291    /// Variant of `public` keyword.
292    PublicKeyword,
293    /// Variant of `readonly` keyword.
294    ReadonlyKeyword,
295    /// Variant of `ref` keyword.
296    RefKeyword,
297    /// Variant of `return` keyword.
298    ReturnKeyword,
299    /// Variant of `sbyte` keyword.
300    SbyteKeyword,
301    /// Variant of `sealed` keyword.
302    SealedKeyword,
303    /// Variant of `short` keyword.
304    ShortKeyword,
305    /// Variant of `sizeof` keyword.
306    SizeofKeyword,
307    /// Variant of `stackalloc` keyword.
308    StackallocKeyword,
309    /// Variant of `static` keyword.
310    StaticKeyword,
311    /// Variant of `string` keyword.
312    StringKeyword,
313    /// Variant of `struct` keyword.
314    StructKeyword,
315    /// Variant of `switch` keyword.
316    SwitchKeyword,
317    /// Variant of `this` keyword.
318    ThisKeyword,
319    /// Variant of `throw` keyword.
320    ThrowKeyword,
321    /// Variant of `true` keyword.
322    TrueKeyword,
323    /// Variant of `try` keyword.
324    TryKeyword,
325    /// Variant of `typeof` keyword.
326    TypeofKeyword,
327    /// Variant of `uint` keyword.
328    UintKeyword,
329    /// Variant of `ulong` keyword.
330    UlongKeyword,
331    /// Variant of `unchecked` keyword.
332    UncheckedKeyword,
333    /// Variant of `unsafe` keyword.
334    UnsafeKeyword,
335    /// Variant of `ushort` keyword.
336    UshortKeyword,
337    /// Variant of `using` keyword.
338    UsingKeyword,
339    /// Variant of `virtual` keyword.
340    VirtualKeyword,
341    /// Variant of `void` keyword.
342    VoidKeyword,
343    /// Variant of `volatile` keyword.
344    VolatileKeyword,
345    /// Variant of `while` keyword.
346    WhileKeyword,
347
348    // Contextual keywords
349    /// The `add` keyword (contextual).
350    AddKeyword,
351    /// The `alias` keyword (contextual).
352    AliasKeyword,
353    /// The `ascending` keyword (contextual).
354    AscendingKeyword,
355    /// The `by` keyword (contextual).
356    ByKeyword,
357    /// The `descending` keyword (contextual).
358    DescendingKeyword,
359    /// The `from` keyword (contextual).
360    FromKeyword,
361    /// The `get` keyword (contextual).
362    GetKeyword,
363    /// The `global` keyword (contextual).
364    GlobalKeyword,
365    /// The `group` keyword (contextual).
366    GroupKeyword,
367    /// The `into` keyword (contextual).
368    IntoKeyword,
369    /// The `join` keyword (contextual).
370    JoinKeyword,
371    /// The `let` keyword (contextual).
372    LetKeyword,
373    /// The `orderby` keyword (contextual).
374    OrderbyKeyword,
375    /// The `partial` keyword (contextual).
376    PartialKeyword,
377    /// The `remove` keyword (contextual).
378    RemoveKeyword,
379    /// The `select` keyword (contextual).
380    SelectKeyword,
381    /// The `set` keyword (contextual).
382    SetKeyword,
383    /// The `value` keyword (contextual).
384    ValueKeyword,
385    /// The `var` keyword (contextual).
386    VarKeyword,
387    /// The `where` keyword (contextual).
388    WhereKeyword,
389    /// The `yield` keyword (contextual).
390    YieldKeyword,
391
392    // Operators
393    /// The `+` operator.
394    Plus,
395    /// The `-` operator.
396    Minus,
397    /// The `*` operator.
398    Star,
399    /// The `/` operator.
400    Slash,
401    /// The `%` operator.
402    Percent,
403    /// The `&` operator.
404    Ampersand,
405    /// The `|` operator.
406    Pipe,
407    /// The `^` operator.
408    Caret,
409    /// The `~` operator.
410    Tilde,
411    /// Bitwise AND operator.
412    BitAnd,
413    /// Bitwise OR operator.
414    BitOr,
415    /// Bitwise XOR operator.
416    BitXor,
417    /// Bitwise NOT operator.
418    BitNot,
419    /// Left shift operator (`<<`).
420    LeftShift,
421    /// Right shift operator (`>>`).
422    RightShift,
423    /// Equality operator (`==`).
424    Equal,
425    /// Inequality operator (`!=`).
426    NotEqual,
427    /// Less than operator (`<`).
428    Less,
429    /// Less than or equal operator (`<=`).
430    LessEqual,
431    /// Greater than operator (`>`).
432    Greater,
433    /// Greater than or equal operator (`>=`).
434    GreaterEqual,
435    /// Logical AND operator (`&&`).
436    LogicalAnd,
437    /// Logical OR operator (`||`).
438    LogicalOr,
439    /// Logical NOT operator (`!`).
440    LogicalNot,
441    /// Question mark (`?`).
442    Question,
443    /// Null-coalescing operator (`??`).
444    QuestionQuestion,
445    /// Increment operator (`++`).
446    Increment,
447    /// Decrement operator (`--`).
448    Decrement,
449    /// Arrow operator (`->`).
450    Arrow,
451    /// Lambda operator (`=>`).
452    Lambda,
453
454    // Assignment operators
455    /// Simple assignment operator (`=`).
456    Assign,
457    /// Addition assignment operator (`+=`).
458    PlusAssign,
459    /// Subtraction assignment operator (`-=`).
460    MinusAssign,
461    /// Multiplication assignment operator (`*=`).
462    StarAssign,
463    /// Division assignment operator (`/=`).
464    SlashAssign,
465    /// Modulo assignment operator (`%=`).
466    PercentAssign,
467    /// Bitwise AND assignment operator (`&=`).
468    AmpersandAssign,
469    /// Bitwise OR assignment operator (`|=`).
470    PipeAssign,
471    /// Bitwise XOR assignment operator (`^=`).
472    CaretAssign,
473    /// Left shift assignment operator (`<<=`).
474    LeftShiftAssign,
475    /// Right shift assignment operator (`>>=`).
476    RightShiftAssign,
477    /// Null-coalescing assignment operator (`??=`).
478    QuestionQuestionAssign,
479    /// Logical AND assignment operator (`&&=`).
480    AndAssign,
481    /// Logical OR assignment operator (`||=`).
482    OrAssign,
483    /// Logical XOR assignment operator (`^=`).
484    XorAssign,
485
486    // Delimiters
487    /// Opening parenthesis (`(`).
488    LeftParen,
489    /// Closing parenthesis (`)`).
490    RightParen,
491    /// Opening bracket (`[`).
492    LeftBracket,
493    /// Closing bracket (`]`).
494    RightBracket,
495    /// Opening brace (`{`).
496    LeftBrace,
497    /// Closing brace (`}`).
498    RightBrace,
499    /// Comma (`,`).
500    Comma,
501    /// Semicolon (`;`).
502    Semicolon,
503    /// Colon (`:`).
504    Colon,
505    /// Double colon (`::`).
506    ColonColon,
507    /// Dot (`.`).
508    Dot,
509    /// Null-conditional operator (`?.`).
510    QuestionDot,
511    /// At sign (`@`).
512    At,
513    /// Hash sign (`#`).
514    Hash,
515    /// Dollar sign (`$`).
516    Dollar,
517
518    /// End of file.
519    Eof,
520    /// An error token.
521    Error,
522
523    // Non-terminal elements
524    /// An `if` statement.
525    IfStatement,
526    /// A `while` statement.
527    WhileStatement,
528    /// A `for` statement.
529    ForStatement,
530    /// A block of statements.
531    Block,
532    /// A `return` statement.
533    ReturnStatement,
534    /// A method declaration.
535    MethodDeclaration,
536    /// A property declaration.
537    PropertyDeclaration,
538    /// A field declaration.
539    FieldDeclaration,
540    /// An indexer declaration.
541    IndexerDeclaration,
542    /// An identifier name.
543    IdentifierName,
544    /// A literal expression.
545    LiteralExpression,
546    /// A binary expression.
547    BinaryExpression,
548    /// An invocation expression.
549    InvocationExpression,
550    /// An element access expression.
551    ElementAccessExpression,
552    /// A member access expression.
553    MemberAccessExpression,
554    /// An assignment expression.
555    AssignmentExpression,
556    /// A `break` statement.
557    BreakStatement,
558    /// A `continue` statement.
559    ContinueStatement,
560    /// An expression statement.
561    ExpressionStatement,
562    /// A `foreach` statement.
563    ForeachStatement,
564    /// A namespace declaration.
565    NamespaceDeclaration,
566    /// A `using` directive.
567    UsingDirective,
568    /// A class declaration.
569    ClassDeclaration,
570    /// An interface declaration.
571    InterfaceDeclaration,
572    /// A struct declaration.
573    StructDeclaration,
574    /// An enum declaration.
575    EnumDeclaration,
576    /// A record declaration.
577    RecordDeclaration,
578    /// A delegate declaration.
579    DelegateDeclaration,
580    /// An event declaration.
581    EventDeclaration,
582    /// An `await` expression.
583    AwaitExpression,
584    /// An attribute list.
585    AttributeList,
586    /// An attribute.
587    Attribute,
588    /// The root of the document.
589    Root,
590}
591
592impl CSharpElementType {
593    /// Returns true if the element type is a keyword.
594    pub fn is_keyword(&self) -> bool {
595        matches!(
596            self,
597            Self::Abstract
598                | Self::As
599                | Self::Base
600                | Self::Bool
601                | Self::Break
602                | Self::Byte
603                | Self::Case
604                | Self::Catch
605                | Self::Char
606                | Self::Checked
607                | Self::Class
608                | Self::Const
609                | Self::Continue
610                | Self::Decimal
611                | Self::Default
612                | Self::Delegate
613                | Self::Do
614                | Self::Double
615                | Self::Else
616                | Self::Enum
617                | Self::Event
618                | Self::Explicit
619                | Self::Extern
620                | Self::False
621                | Self::Finally
622                | Self::Fixed
623                | Self::Float
624                | Self::For
625                | Self::Foreach
626                | Self::Goto
627                | Self::If
628                | Self::Implicit
629                | Self::In
630                | Self::Int
631                | Self::Interface
632                | Self::Internal
633                | Self::Is
634                | Self::Lock
635                | Self::Long
636                | Self::Namespace
637                | Self::New
638                | Self::Null
639                | Self::Object
640                | Self::Operator
641                | Self::Out
642                | Self::Override
643                | Self::Params
644                | Self::Private
645                | Self::Protected
646                | Self::Public
647                | Self::Readonly
648                | Self::Ref
649                | Self::Return
650                | Self::Sbyte
651                | Self::Sealed
652                | Self::Short
653                | Self::Sizeof
654                | Self::Stackalloc
655                | Self::Static
656                | Self::Struct
657                | Self::Switch
658                | Self::This
659                | Self::Throw
660                | Self::True
661                | Self::Try
662                | Self::Typeof
663                | Self::Uint
664                | Self::Ulong
665                | Self::Unchecked
666                | Self::Unsafe
667                | Self::Ushort
668                | Self::Using
669                | Self::Virtual
670                | Self::Void
671                | Self::Volatile
672                | Self::While
673                | Self::AbstractKeyword
674                | Self::AsKeyword
675                | Self::BaseKeyword
676                | Self::BoolKeyword
677                | Self::BreakKeyword
678                | Self::ByteKeyword
679                | Self::CaseKeyword
680                | Self::CatchKeyword
681                | Self::CharKeyword
682                | Self::CheckedKeyword
683                | Self::ClassKeyword
684                | Self::ConstKeyword
685                | Self::ContinueKeyword
686                | Self::DecimalKeyword
687                | Self::DefaultKeyword
688                | Self::DelegateKeyword
689                | Self::DoKeyword
690                | Self::DoubleKeyword
691                | Self::ElseKeyword
692                | Self::EnumKeyword
693                | Self::EventKeyword
694                | Self::ExplicitKeyword
695                | Self::ExternKeyword
696                | Self::FalseKeyword
697                | Self::FinallyKeyword
698                | Self::FixedKeyword
699                | Self::FloatKeyword
700                | Self::ForKeyword
701                | Self::ForeachKeyword
702                | Self::GotoKeyword
703                | Self::IfKeyword
704                | Self::ImplicitKeyword
705                | Self::InKeyword
706                | Self::IntKeyword
707                | Self::InterfaceKeyword
708                | Self::InternalKeyword
709                | Self::IsKeyword
710                | Self::LockKeyword
711                | Self::LongKeyword
712                | Self::NamespaceKeyword
713                | Self::NewKeyword
714                | Self::NullKeyword
715                | Self::ObjectKeyword
716                | Self::OperatorKeyword
717                | Self::OutKeyword
718                | Self::OverrideKeyword
719                | Self::ParamsKeyword
720                | Self::PrivateKeyword
721                | Self::ProtectedKeyword
722                | Self::PublicKeyword
723                | Self::ReadonlyKeyword
724                | Self::RefKeyword
725                | Self::ReturnKeyword
726                | Self::SbyteKeyword
727                | Self::SealedKeyword
728                | Self::ShortKeyword
729                | Self::SizeofKeyword
730                | Self::StackallocKeyword
731                | Self::StaticKeyword
732                | Self::StringKeyword
733                | Self::StructKeyword
734                | Self::SwitchKeyword
735                | Self::ThisKeyword
736                | Self::ThrowKeyword
737                | Self::TrueKeyword
738                | Self::TryKeyword
739                | Self::TypeofKeyword
740                | Self::UintKeyword
741                | Self::UlongKeyword
742                | Self::UncheckedKeyword
743                | Self::UnsafeKeyword
744                | Self::UshortKeyword
745                | Self::UsingKeyword
746                | Self::VirtualKeyword
747                | Self::VoidKeyword
748                | Self::VolatileKeyword
749                | Self::WhileKeyword
750                | Self::AddKeyword
751                | Self::AliasKeyword
752                | Self::AscendingKeyword
753                | Self::ByKeyword
754                | Self::DescendingKeyword
755                | Self::FromKeyword
756                | Self::GetKeyword
757                | Self::GlobalKeyword
758                | Self::GroupKeyword
759                | Self::IntoKeyword
760                | Self::JoinKeyword
761                | Self::LetKeyword
762                | Self::OrderbyKeyword
763                | Self::PartialKeyword
764                | Self::RemoveKeyword
765                | Self::SelectKeyword
766                | Self::SetKeyword
767                | Self::ValueKeyword
768                | Self::VarKeyword
769                | Self::WhereKeyword
770                | Self::YieldKeyword
771        )
772    }
773}
774
775impl ElementType for CSharpElementType {
776    type Role = UniversalElementRole;
777
778    fn role(&self) -> Self::Role {
779        match self {
780            _ => UniversalElementRole::None,
781        }
782    }
783}
784
785impl From<crate::lexer::token_type::CSharpTokenType> for CSharpElementType {
786    fn from(token: crate::lexer::token_type::CSharpTokenType) -> Self {
787        unsafe { std::mem::transmute(token as u16) }
788    }
789}