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}