Skip to main content

oak_wit/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub enum WitSyntaxKind {
6    // 基础 kind
7    Root,
8    Whitespace,
9    Newline,
10    Comment,
11    Error,
12    Eof,
13    Text,
14
15    // 字面量
16    IntegerLiteral,
17    FloatLiteral,
18    StringLiteral,
19    Identifier,
20
21    // WIT Component 关键字 - 基本结构
22    WorldKw,
23    InterfaceKw,
24    PackageKw,
25    ComponentKw,
26    InstanceKw,
27    ModuleKw,
28    CoreKw,
29    FuncKw,
30    TypeKw,
31    RecordKw,
32    VariantKw,
33    EnumKw,
34    FlagsKw,
35    UnionKw,
36    TupleKw,
37    ListKw,
38    OptionKw,
39    ResultKw,
40    ResourceKw,
41
42    // 导入导出
43    ImportKw,
44    ExportKw,
45    UseKw,
46    IncludeKw,
47    WithKw,
48
49    // 类型相关
50    StaticKw,
51    ConstructorKw,
52    MethodKw,
53
54    // 基本类型
55    BoolKw,
56    U8Kw,
57    U16Kw,
58    U32Kw,
59    U64Kw,
60    S8Kw,
61    S16Kw,
62    S32Kw,
63    S64Kw,
64    F32Kw,
65    F64Kw,
66    CharKw,
67    StringKw,
68
69    // 操作符
70    Arrow,     // ->
71    FatArrow,  // =>
72    Assign,    // =
73    Colon,     // :
74    Semicolon, // ;
75    Comma,     // ,
76    Dot,       // .
77    Question,  // ?
78    At,        // @
79    Hash,      // #
80    Dollar,    // $
81    Percent,   // %
82    Ampersand, // &
83    Star,      // *
84    Plus,      // +
85    Minus,     // -
86    Slash,     // /
87    Lt,        // <
88    Gt,        // >
89    Pipe,      // |
90    Caret,     // ^
91    Tilde,     // ~
92    Bang,      // !
93
94    // 标点符号
95    LeftParen,    // (
96    RightParen,   // )
97    LeftBrace,    // {
98    RightBrace,   // }
99    LeftBracket,  // [
100    RightBracket, // ]
101}
102
103impl std::fmt::Display for WitSyntaxKind {
104    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
105        write!(f, "{:?}", self)
106    }
107}
108
109impl TokenType for WitSyntaxKind {
110    const END_OF_STREAM: Self = Self::Eof;
111    type Role = UniversalTokenRole;
112
113    fn role(&self) -> Self::Role {
114        match self {
115            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
116            Self::Comment => UniversalTokenRole::Comment,
117            Self::Eof => UniversalTokenRole::Eof,
118            _ => UniversalTokenRole::None,
119        }
120    }
121}
122
123impl ElementType for WitSyntaxKind {
124    type Role = UniversalElementRole;
125
126    fn is_root(&self) -> bool {
127        matches!(self, Self::Root)
128    }
129
130    fn role(&self) -> Self::Role {
131        match self {
132            Self::Root => UniversalElementRole::Root,
133            Self::Error => UniversalElementRole::Error,
134            _ => UniversalElementRole::None,
135        }
136    }
137}