oak_d/kind/mod.rs
1use oak_core::{SyntaxKind, Token};
2
3/// Token type for D language syntax
4pub type DToken = Token<DSyntaxKind>;
5
6/// D language syntax kinds
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub enum DSyntaxKind {
9 /// Root node of the syntax tree
10 Root,
11 /// Module declaration
12 Module,
13 /// Declaration statement
14 Declaration,
15 /// Statement
16 Statement,
17 /// Expression
18 Expression,
19 /// Type specification
20 Type,
21 /// module keyword
22 ModuleKeyword,
23 /// import keyword
24 ImportKeyword,
25 /// public keyword
26 PublicKeyword,
27 /// private keyword
28 PrivateKeyword,
29 /// protected keyword
30 ProtectedKeyword,
31 /// package keyword
32 PackageKeyword,
33 /// export keyword
34 ExportKeyword,
35 /// static keyword
36 StaticKeyword,
37 /// final keyword
38 FinalKeyword,
39 /// abstract keyword
40 AbstractKeyword,
41 /// override keyword
42 OverrideKeyword,
43 /// synchronized keyword
44 SynchronizedKeyword,
45 /// const keyword
46 ConstKeyword,
47 /// immutable keyword
48 ImmutableKeyword,
49 /// inout keyword
50 InoutKeyword,
51 /// shared keyword
52 SharedKeyword,
53 /// class keyword
54 ClassKeyword,
55 /// struct keyword
56 StructKeyword,
57 /// interface keyword
58 InterfaceKeyword,
59 /// union keyword
60 UnionKeyword,
61 /// enum keyword
62 EnumKeyword,
63 /// function keyword
64 FunctionKeyword,
65 /// delegate keyword
66 DelegateKeyword,
67 /// if keyword
68 IfKeyword,
69 /// else keyword
70 ElseKeyword,
71 /// while keyword
72 WhileKeyword,
73 /// for keyword
74 ForKeyword,
75 /// foreach keyword
76 ForeachKeyword,
77 /// do keyword
78 DoKeyword,
79 /// switch keyword
80 SwitchKeyword,
81 /// case keyword
82 CaseKeyword,
83 /// default keyword
84 DefaultKeyword,
85 /// break keyword
86 BreakKeyword,
87 /// continue keyword
88 ContinueKeyword,
89 /// return keyword
90 ReturnKeyword,
91 /// goto keyword
92 GotoKeyword,
93 /// try keyword
94 TryKeyword,
95 /// catch keyword
96 CatchKeyword,
97 /// finally keyword
98 FinallyKeyword,
99 /// throw keyword
100 ThrowKeyword,
101 /// scope keyword
102 ScopeKeyword,
103 /// with keyword
104 WithKeyword,
105 /// synchronized keyword (second occurrence)
106 SynchronizedKeyword2,
107 /// asm keyword
108 AsmKeyword,
109 /// mixin keyword
110 MixinKeyword,
111 /// template keyword
112 TemplateKeyword,
113 /// this keyword
114 ThisKeyword,
115 /// super keyword
116 SuperKeyword,
117 /// null keyword
118 NullKeyword,
119 /// true keyword
120 TrueKeyword,
121 /// false keyword
122 FalseKeyword,
123 /// cast keyword
124 CastKeyword,
125 /// new keyword
126 NewKeyword,
127 /// delete keyword
128 DeleteKeyword,
129 /// typeof keyword
130 TypeofKeyword,
131 /// typeid keyword
132 TypeidKeyword,
133 /// is keyword
134 IsKeyword,
135 /// in keyword
136 InKeyword,
137 /// out keyword
138 OutKeyword,
139 /// ref keyword
140 RefKeyword,
141 /// lazy keyword
142 LazyKeyword,
143 /// auto keyword
144 AutoKeyword,
145 /// alias keyword
146 AliasKeyword,
147 /// typedef keyword
148 TypedefKeyword,
149 /// extern keyword
150 ExternKeyword,
151 /// pure keyword
152 PureKeyword,
153 /// nothrow keyword
154 NothrowKeyword,
155 /// safe keyword
156 SafeKeyword,
157 /// trusted keyword
158 TrustedKeyword,
159 /// system keyword
160 SystemKeyword,
161 /// nogc keyword
162 NogcKeyword,
163 /// property keyword
164 PropertyKeyword,
165 /// disable keyword
166 DisableKeyword,
167 /// deprecated keyword
168 DeprecatedKeyword,
169 /// version keyword
170 VersionKeyword,
171 /// debug keyword
172 DebugKeyword,
173 /// unittest keyword
174 UnitTestKeyword,
175 /// invariant keyword
176 InvariantKeyword,
177 /// body keyword
178 BodyKeyword,
179 /// pragma keyword
180 PragmaKeyword,
181 /// align keyword
182 AlignKeyword,
183
184 // 基本类型
185 /// void type
186 VoidType,
187 /// bool type
188 BoolType,
189 /// byte type
190 ByteType,
191 /// ubyte type
192 UbyteType,
193 /// short type
194 ShortType,
195 /// ushort type
196 UshortType,
197 /// int type
198 IntType,
199 /// uint type
200 UintType,
201 /// long type
202 LongType,
203 /// ulong type
204 UlongType,
205 /// cent type
206 CentType,
207 /// ucent type
208 UcentType,
209 /// float type
210 FloatType,
211 /// double type
212 DoubleType,
213 /// real type
214 RealType,
215 /// ifloat type
216 IfloatType,
217 /// idouble type
218 IdoubleType,
219 /// ireal type
220 IrealType,
221 /// cfloat type
222 CfloatType,
223 /// cdouble type
224 CdoubleType,
225 /// creal type
226 CrealType,
227 /// char type
228 CharType,
229 /// wchar type
230 WcharType,
231 /// dchar type
232 DcharType,
233 /// string type
234 StringType,
235 /// wstring type
236 WstringType,
237 /// dstring type
238 DstringType,
239
240 // 操作符
241 /// plus operator
242 Plus,
243 /// minus operator
244 Minus,
245 /// multiply operator
246 Multiply,
247 /// divide operator
248 Divide,
249 /// modulo operator
250 Modulo,
251 /// bitwise and operator
252 BitwiseAnd,
253 /// bitwise or operator
254 BitwiseOr,
255 /// bitwise xor operator
256 BitwiseXor,
257 /// bitwise not operator
258 BitwiseNot,
259 /// left shift operator
260 LeftShift,
261 /// right shift operator
262 RightShift,
263 /// unsigned right shift operator
264 UnsignedRightShift,
265 /// equal operator
266 Equal,
267 /// not equal operator
268 NotEqual,
269 /// less than operator
270 Less,
271 /// less than or equal operator
272 LessEqual,
273 /// greater than operator
274 Greater,
275 /// greater than or equal operator
276 GreaterEqual,
277 /// identity operator
278 Identity,
279 /// not identity operator
280 NotIdentity,
281 /// assign operator
282 Assign,
283 /// plus assign operator
284 PlusAssign,
285 /// minus assign operator
286 MinusAssign,
287 /// multiply assign operator
288 MultiplyAssign,
289 /// divide assign operator
290 DivideAssign,
291 /// modulo assign operator
292 ModuloAssign,
293 /// bitwise and assign operator
294 BitwiseAndAssign,
295 /// bitwise or assign operator
296 BitwiseOrAssign,
297 /// bitwise xor assign operator
298 BitwiseXorAssign,
299 /// left shift assign operator
300 LeftShiftAssign,
301 /// right shift assign operator
302 RightShiftAssign,
303 /// unsigned right shift assign operator
304 UnsignedRightShiftAssign,
305 /// concatenate assign operator
306 ConcatenateAssign,
307 /// logical and operator
308 LogicalAnd,
309 /// logical or operator
310 LogicalOr,
311 /// increment operator
312 Increment,
313 /// decrement operator
314 Decrement,
315 /// not operator
316 Not,
317 /// question operator
318 Question,
319 /// dollar operator
320 Dollar,
321 /// at operator
322 At,
323
324 // 分隔符
325 /// left parenthesis
326 LeftParen,
327 /// right parenthesis
328 RightParen,
329 /// left bracket
330 LeftBracket,
331 /// right bracket
332 RightBracket,
333 /// left brace
334 LeftBrace,
335 /// right brace
336 RightBrace,
337 /// semicolon
338 Semicolon,
339 /// comma
340 Comma,
341 /// dot
342 Dot,
343 /// dot dot
344 DotDot,
345 /// dot dot dot
346 DotDotDot,
347 /// colon
348 Colon,
349 /// arrow
350 Arrow,
351 /// hash
352 Hash,
353
354 // 字面量
355 /// integer literal
356 IntegerLiteral,
357 /// float literal
358 FloatLiteral,
359 /// string literal
360 StringLiteral,
361 /// char literal
362 CharLiteral,
363
364 // 标识符和注释
365 /// identifier
366 Identifier,
367 /// line comment
368 LineComment,
369 /// block comment
370 BlockComment,
371 /// nested comment
372 NestedComment,
373
374 // 空白和特殊
375 /// whitespace
376 Whitespace,
377 /// newline
378 Newline,
379 /// end of file
380 Eof,
381 /// error
382 Error,
383}
384
385impl SyntaxKind for DSyntaxKind {
386 /// Check if the syntax kind is trivia (whitespace or newline)
387 fn is_trivia(&self) -> bool {
388 matches!(self, Self::Whitespace | Self::Newline)
389 }
390
391 /// Check if the syntax kind is a comment
392 fn is_comment(&self) -> bool {
393 matches!(self, Self::LineComment | Self::BlockComment | Self::NestedComment)
394 }
395
396 /// Check if the syntax kind is whitespace
397 fn is_whitespace(&self) -> bool {
398 matches!(self, Self::Whitespace)
399 }
400
401 /// Check if the syntax kind is a token type
402 fn is_token_type(&self) -> bool {
403 matches!(
404 self,
405 Self::ModuleKeyword
406 | Self::ImportKeyword
407 | Self::PublicKeyword
408 | Self::PrivateKeyword
409 | Self::ProtectedKeyword
410 | Self::PackageKeyword
411 | Self::ExportKeyword
412 | Self::StaticKeyword
413 | Self::FinalKeyword
414 | Self::AbstractKeyword
415 | Self::OverrideKeyword
416 | Self::SynchronizedKeyword
417 | Self::ConstKeyword
418 | Self::ImmutableKeyword
419 | Self::InoutKeyword
420 | Self::SharedKeyword
421 | Self::ClassKeyword
422 | Self::StructKeyword
423 | Self::InterfaceKeyword
424 | Self::UnionKeyword
425 | Self::EnumKeyword
426 | Self::FunctionKeyword
427 | Self::DelegateKeyword
428 | Self::IfKeyword
429 | Self::ElseKeyword
430 | Self::WhileKeyword
431 | Self::ForKeyword
432 | Self::ForeachKeyword
433 | Self::DoKeyword
434 | Self::SwitchKeyword
435 | Self::CaseKeyword
436 | Self::DefaultKeyword
437 | Self::BreakKeyword
438 | Self::ContinueKeyword
439 | Self::ReturnKeyword
440 | Self::GotoKeyword
441 | Self::TryKeyword
442 | Self::CatchKeyword
443 | Self::FinallyKeyword
444 | Self::ThrowKeyword
445 | Self::ScopeKeyword
446 | Self::WithKeyword
447 | Self::SynchronizedKeyword2
448 | Self::AsmKeyword
449 | Self::MixinKeyword
450 | Self::TemplateKeyword
451 | Self::ThisKeyword
452 | Self::SuperKeyword
453 | Self::NullKeyword
454 | Self::TrueKeyword
455 | Self::FalseKeyword
456 | Self::CastKeyword
457 | Self::NewKeyword
458 | Self::DeleteKeyword
459 | Self::TypeofKeyword
460 | Self::TypeidKeyword
461 | Self::IsKeyword
462 | Self::InKeyword
463 | Self::OutKeyword
464 | Self::RefKeyword
465 | Self::LazyKeyword
466 | Self::AutoKeyword
467 | Self::AliasKeyword
468 | Self::TypedefKeyword
469 | Self::ExternKeyword
470 | Self::PureKeyword
471 | Self::NothrowKeyword
472 | Self::SafeKeyword
473 | Self::TrustedKeyword
474 | Self::SystemKeyword
475 | Self::NogcKeyword
476 | Self::PropertyKeyword
477 | Self::DisableKeyword
478 | Self::DeprecatedKeyword
479 | Self::VersionKeyword
480 | Self::DebugKeyword
481 | Self::UnitTestKeyword
482 | Self::InvariantKeyword
483 | Self::BodyKeyword
484 | Self::PragmaKeyword
485 | Self::AlignKeyword
486 | Self::VoidType
487 | Self::BoolType
488 | Self::ByteType
489 | Self::UbyteType
490 | Self::ShortType
491 | Self::UshortType
492 | Self::IntType
493 | Self::UintType
494 | Self::LongType
495 | Self::UlongType
496 | Self::CentType
497 | Self::UcentType
498 | Self::FloatType
499 | Self::DoubleType
500 | Self::RealType
501 | Self::IfloatType
502 | Self::IdoubleType
503 | Self::IrealType
504 | Self::CfloatType
505 | Self::CdoubleType
506 | Self::CrealType
507 | Self::CharType
508 | Self::WcharType
509 | Self::DcharType
510 | Self::StringType
511 | Self::WstringType
512 | Self::DstringType
513 | Self::Plus
514 | Self::Minus
515 | Self::Multiply
516 | Self::Divide
517 | Self::Modulo
518 | Self::BitwiseAnd
519 | Self::BitwiseOr
520 | Self::BitwiseXor
521 | Self::BitwiseNot
522 | Self::LeftShift
523 | Self::RightShift
524 | Self::UnsignedRightShift
525 | Self::Equal
526 | Self::NotEqual
527 | Self::Less
528 | Self::LessEqual
529 | Self::Greater
530 | Self::GreaterEqual
531 | Self::Identity
532 | Self::NotIdentity
533 | Self::Assign
534 | Self::PlusAssign
535 | Self::MinusAssign
536 | Self::MultiplyAssign
537 | Self::DivideAssign
538 | Self::ModuloAssign
539 | Self::BitwiseAndAssign
540 | Self::BitwiseOrAssign
541 | Self::BitwiseXorAssign
542 | Self::LeftShiftAssign
543 | Self::RightShiftAssign
544 | Self::UnsignedRightShiftAssign
545 | Self::ConcatenateAssign
546 | Self::LogicalAnd
547 | Self::LogicalOr
548 | Self::Increment
549 | Self::Decrement
550 | Self::Not
551 | Self::Question
552 | Self::Dollar
553 | Self::At
554 | Self::LeftParen
555 | Self::RightParen
556 | Self::LeftBracket
557 | Self::RightBracket
558 | Self::LeftBrace
559 | Self::RightBrace
560 | Self::Semicolon
561 | Self::Comma
562 | Self::Dot
563 | Self::DotDot
564 | Self::DotDotDot
565 | Self::Colon
566 | Self::Arrow
567 | Self::Hash
568 | Self::IntegerLiteral
569 | Self::FloatLiteral
570 | Self::StringLiteral
571 | Self::CharLiteral
572 | Self::Identifier
573 | Self::LineComment
574 | Self::BlockComment
575 | Self::NestedComment
576 | Self::Whitespace
577 | Self::Newline
578 | Self::Eof
579 )
580 }
581
582 /// Check if the syntax kind is an element type
583 fn is_element_type(&self) -> bool {
584 matches!(self, Self::Root | Self::Module | Self::Declaration | Self::Statement | Self::Expression | Self::Type)
585 }
586}