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}