Skip to main content

oak_csharp/parser/
element_type.rs

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