Skip to main content

oak_d/kind/
mod.rs

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