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}