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}