Skip to main content

oak_d/parser/
element_type.rs

1//! Element types for the D parser.
2
3use oak_core::{ElementType, UniversalElementRole};
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6
7/// Element types for the D programming language.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10pub enum DElementType {
11    /// The root of the parse tree.
12    Root,
13    /// A module declaration.
14    Module,
15    /// A declaration.
16    Declaration,
17    /// A statement.
18    Statement,
19    /// An expression.
20    Expression,
21    /// A type.
22    Type,
23    /// An aggregate (class, struct, etc.).
24    Aggregate,
25    /// An import declaration.
26    Import,
27    /// The `module` keyword.
28    ModuleKeyword,
29    /// The `import` keyword.
30    ImportKeyword,
31    /// The `public` keyword.
32    PublicKeyword,
33    /// The `private` keyword.
34    PrivateKeyword,
35    /// The `protected` keyword.
36    ProtectedKeyword,
37    /// The `package` keyword.
38    PackageKeyword,
39    /// The `export` keyword.
40    ExportKeyword,
41    /// The `static` keyword.
42    StaticKeyword,
43    /// The `final` keyword.
44    FinalKeyword,
45    /// The `abstract` keyword.
46    AbstractKeyword,
47    /// The `override` keyword.
48    OverrideKeyword,
49    /// The `synchronized` keyword.
50    SynchronizedKeyword,
51    /// The `const` keyword.
52    ConstKeyword,
53    /// The `immutable` keyword.
54    ImmutableKeyword,
55    /// The `inout` keyword.
56    InoutKeyword,
57    /// The `shared` keyword.
58    SharedKeyword,
59    /// The `class` keyword.
60    ClassKeyword,
61    /// The `struct` keyword.
62    StructKeyword,
63    /// The `interface` keyword.
64    InterfaceKeyword,
65    /// The `union` keyword.
66    UnionKeyword,
67    /// The `enum` keyword.
68    EnumKeyword,
69    /// The `function` keyword.
70    FunctionKeyword,
71    /// The `delegate` keyword.
72    DelegateKeyword,
73    /// The `if` keyword.
74    IfKeyword,
75    /// The `else` keyword.
76    ElseKeyword,
77    /// The `while` keyword.
78    WhileKeyword,
79    /// The `for` keyword.
80    ForKeyword,
81    /// The `foreach` keyword.
82    ForeachKeyword,
83    /// The `do` keyword.
84    DoKeyword,
85    /// The `switch` keyword.
86    SwitchKeyword,
87    /// The `case` keyword.
88    CaseKeyword,
89    /// The `default` keyword.
90    DefaultKeyword,
91    /// The `break` keyword.
92    BreakKeyword,
93    /// The `continue` keyword.
94    ContinueKeyword,
95    /// The `return` keyword.
96    ReturnKeyword,
97    /// The `goto` keyword.
98    GotoKeyword,
99    /// The `try` keyword.
100    TryKeyword,
101    /// The `catch` keyword.
102    CatchKeyword,
103    /// The `finally` keyword.
104    FinallyKeyword,
105    /// The `throw` keyword.
106    ThrowKeyword,
107    /// The `scope` keyword.
108    ScopeKeyword,
109    /// The `with` keyword.
110    WithKeyword,
111    /// Another `synchronized` keyword variant.
112    SynchronizedKeyword2,
113    /// The `asm` keyword.
114    AsmKeyword,
115    /// The `mixin` keyword.
116    MixinKeyword,
117    /// The `template` keyword.
118    TemplateKeyword,
119    /// The `this` keyword.
120    ThisKeyword,
121    /// The `super` keyword.
122    SuperKeyword,
123    /// The `null` keyword.
124    NullKeyword,
125    /// The `true` keyword.
126    TrueKeyword,
127    /// The `false` keyword.
128    FalseKeyword,
129    /// The `cast` keyword.
130    CastKeyword,
131    /// The `new` keyword.
132    NewKeyword,
133    /// The `delete` keyword.
134    DeleteKeyword,
135    /// The `typeof` keyword.
136    TypeofKeyword,
137    /// The `typeid` keyword.
138    TypeidKeyword,
139    /// The `is` keyword.
140    IsKeyword,
141    /// The `in` keyword.
142    InKeyword,
143    /// The `out` keyword.
144    OutKeyword,
145    /// The `ref` keyword.
146    RefKeyword,
147    /// The `lazy` keyword.
148    LazyKeyword,
149    /// The `auto` keyword.
150    AutoKeyword,
151    /// The `alias` keyword.
152    AliasKeyword,
153    /// The `typedef` keyword.
154    TypedefKeyword,
155    /// The `extern` keyword.
156    ExternKeyword,
157    /// The `pure` keyword.
158    PureKeyword,
159    /// The `nothrow` keyword.
160    NothrowKeyword,
161    /// The `safe` keyword.
162    SafeKeyword,
163    /// The `trusted` keyword.
164    TrustedKeyword,
165    /// The `system` keyword.
166    SystemKeyword,
167    /// The `nogc` keyword.
168    NogcKeyword,
169    /// The `property` keyword.
170    PropertyKeyword,
171    /// The `disable` keyword.
172    DisableKeyword,
173    /// The `deprecated` keyword.
174    DeprecatedKeyword,
175    /// The `version` keyword.
176    VersionKeyword,
177    /// The `debug` keyword.
178    DebugKeyword,
179    /// The `unittest` keyword.
180    UnitTestKeyword,
181    /// The `invariant` keyword.
182    InvariantKeyword,
183    /// The `body` keyword.
184    BodyKeyword,
185    /// The `pragma` keyword.
186    PragmaKeyword,
187    /// The `align` keyword.
188    AlignKeyword,
189    /// The `void` type.
190    VoidType,
191    /// The `bool` type.
192    BoolType,
193    /// The `byte` type.
194    ByteType,
195    /// The `ubyte` type.
196    UbyteType,
197    /// The `short` type.
198    ShortType,
199    /// The `ushort` type.
200    UshortType,
201    /// The `int` type.
202    IntType,
203    /// The `uint` type.
204    UintType,
205    /// The `long` type.
206    LongType,
207    /// The `ulong` type.
208    UlongType,
209    /// The `cent` type.
210    CentType,
211    /// The `ucent` type.
212    UcentType,
213    /// The `float` type.
214    FloatType,
215    /// The `double` type.
216    DoubleType,
217    /// The `real` type.
218    RealType,
219    /// The `ifloat` type.
220    IfloatType,
221    /// The `idouble` type.
222    IdoubleType,
223    /// The `ireal` type.
224    IrealType,
225    /// The `cfloat` type.
226    CfloatType,
227    /// The `cdouble` type.
228    CdoubleType,
229    /// The `creal` type.
230    CrealType,
231    /// The `char` type.
232    CharType,
233    /// The `wchar` type.
234    WcharType,
235    /// The `dchar` type.
236    DcharType,
237    /// The `string` type.
238    StringType,
239    /// The `wstring` type.
240    WstringType,
241    /// The `dstring` type.
242    DstringType,
243    /// The `+` operator.
244    Plus,
245    /// The `-` operator.
246    Minus,
247    /// The `*` operator.
248    Multiply,
249    /// The `/` operator.
250    Divide,
251    /// The `%` operator.
252    Modulo,
253    /// The `&` operator.
254    BitwiseAnd,
255    /// The `|` operator.
256    BitwiseOr,
257    /// The `^` operator.
258    BitwiseXor,
259    /// The `~` operator.
260    BitwiseNot,
261    /// The `<<` operator.
262    LeftShift,
263    /// The `>>` operator.
264    RightShift,
265    /// The `>>>` operator.
266    UnsignedRightShift,
267    /// The `==` operator.
268    Equal,
269    /// The `!=` operator.
270    NotEqual,
271    /// The `<` operator.
272    Less,
273    /// The `<=` operator.
274    LessEqual,
275    /// The `>` operator.
276    Greater,
277    /// The `>=` operator.
278    GreaterEqual,
279    /// The `is` operator.
280    Identity,
281    /// The `!is` operator.
282    NotIdentity,
283    /// The `=` operator.
284    Assign,
285    /// The `+=` operator.
286    PlusAssign,
287    /// The `-=` operator.
288    MinusAssign,
289    /// The `*=` operator.
290    MultiplyAssign,
291    /// The `/=` operator.
292    DivideAssign,
293    /// The `%=` operator.
294    ModuloAssign,
295    /// The `&=` operator.
296    BitwiseAndAssign,
297    /// The `|=` operator.
298    BitwiseOrAssign,
299    /// The `^=` operator.
300    BitwiseXorAssign,
301    /// The `<<=` operator.
302    LeftShiftAssign,
303    /// The `>>=` operator.
304    RightShiftAssign,
305    /// The `>>>=` operator.
306    UnsignedRightShiftAssign,
307    /// The `~=` operator.
308    ConcatenateAssign,
309    /// The `&&` operator.
310    LogicalAnd,
311    /// The `||` operator.
312    LogicalOr,
313    /// The `++` operator.
314    Increment,
315    /// The `--` operator.
316    Decrement,
317    /// The `!` operator.
318    Not,
319    /// The `?` operator.
320    Question,
321    /// The `$` operator.
322    Dollar,
323    /// The `@` operator.
324    At,
325    /// Opening parenthesis (`(`).
326    LeftParen,
327    /// Closing parenthesis (`)`).
328    RightParen,
329    /// Opening bracket (`[`).
330    LeftBracket,
331    /// Closing bracket (`]`).
332    RightBracket,
333    /// Opening brace (`{`).
334    LeftBrace,
335    /// Closing brace (`}`).
336    RightBrace,
337    /// Semicolon (`;`).
338    Semicolon,
339    /// Comma (`,`).
340    Comma,
341    /// Dot (`.`).
342    Dot,
343    /// Double dot (`..`).
344    DotDot,
345    /// Triple dot (`...`).
346    DotDotDot,
347    /// Colon (`:`).
348    Colon,
349    /// Arrow (`->`).
350    Arrow,
351    /// Hash (`#`).
352    Hash,
353    /// An integer literal.
354    IntegerLiteral,
355    /// A floating-point literal.
356    FloatLiteral,
357    /// A string literal.
358    StringLiteral,
359    /// A character literal.
360    CharLiteral,
361    /// An identifier.
362    Identifier,
363    /// A line comment.
364    LineComment,
365    /// A block comment.
366    BlockComment,
367    /// A nested comment.
368    NestedComment,
369    /// Whitespace.
370    Whitespace,
371    /// A newline.
372    Newline,
373    /// End of stream.
374    Eof,
375    /// An error.
376    Error,
377}
378
379impl ElementType for DElementType {
380    type Role = UniversalElementRole;
381
382    fn role(&self) -> Self::Role {
383        match self {
384            Self::Root => UniversalElementRole::Root,
385
386            Self::Error => UniversalElementRole::Error,
387            _ => UniversalElementRole::None,
388        }
389    }
390}
391
392impl From<crate::lexer::token_type::DTokenType> for DElementType {
393    fn from(token: crate::lexer::token_type::DTokenType) -> Self {
394        unsafe { std::mem::transmute(token) }
395    }
396}