Skip to main content

oak_fsharp/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
5pub enum FSharpSyntaxKind {
6    // 基础 tokens
7    Root,
8    Whitespace,
9    Newline,
10
11    // 标识符和字面
12    Identifier,
13    IntegerLiteral,
14    FloatLiteral,
15    StringLiteral,
16    CharLiteral,
17    BooleanLiteral,
18    UnitLiteral,
19
20    // 关键- 基础
21    Let,
22    Rec,
23    And,
24    In,
25    If,
26    Then,
27    Else,
28    Elif,
29    Match,
30    With,
31    When,
32    Function,
33    Fun,
34
35    // 关键- 类型
36    Type,
37    Val,
38    Mutable,
39    Of,
40    As,
41
42    // 关键- 模块和命名空
43    Module,
44    Namespace,
45    Open,
46
47    // 关键- 异常处理
48    Try,
49    Finally,
50    Exception,
51    Raise,
52    Failwith,
53
54    // 关键- 循环和控制流
55    For,
56    To,
57    Downto,
58    Do,
59    Done,
60    While,
61    Yield,
62    Return,
63
64    // 关键- 面向对象
65    Class,
66    Interface,
67    Inherit,
68    Abstract,
69    Override,
70    Default,
71    Member,
72    Static,
73    New,
74
75    // 关键- 其他
76    Lazy,
77    Async,
78    Seq,
79    Use,
80    Begin,
81    End,
82    Struct,
83    Sig,
84
85    // 关键字 - 布尔和特殊值
86    True,
87    False,
88    Null,
89    Or,
90
91    // 关键字 - 访问修饰符
92    Public,
93    Private,
94    Internal,
95
96    // 关键字 - 其他
97    Inline,
98    Extern,
99    Upcast,
100    Downcast,
101    Assert,
102    Global,
103    Base,
104    This,
105    Void,
106
107    // 类型关键字
108    Obj,
109    Unit,
110    Int,
111    Float,
112    String,
113    Bool,
114    Char,
115    Byte,
116    SByte,
117    Int16,
118    UInt16,
119    Int32,
120    UInt32,
121    Int64,
122    UInt64,
123    NativeInt,
124    UNativeInt,
125    Decimal,
126    BigInt,
127
128    // 运算- 算术
129    Plus,     // +
130    Minus,    // -
131    Star,     // *
132    Slash,    // /
133    Percent,  // %
134    StarStar, // **
135
136    // 运算- 比较
137    Equal,        // =
138    NotEqual,     // <>
139    LessThan,     // <
140    LessEqual,    // <=
141    GreaterThan,  // >
142    GreaterEqual, // >=
143
144    // 运算- 逻辑
145    AndAnd, // &&
146    OrOr,   // ||
147    Not,    // not
148
149    // 运算- 位运
150    BitwiseAnd, // &&&
151    BitwiseOr,  // |||
152    BitwiseXor, // ^^^
153    BitwiseNot, // ~~~
154    LeftShift,  // <<<
155    RightShift, // >>>
156
157    // 运算- 特殊
158    Arrow,       // ->
159    DoubleArrow, // =>
160    Pipe,        // |
161    PipeRight,   // |>
162    DoublePipe,  // ||
163    Cons,        // ::
164    At,          // @
165    Compose,     // >>
166    ComposeBack, // <<
167    Dollar,      // $
168
169    // 运算符 - 其他
170    LogicalAnd,  // &&
171    LogicalOr,   // ||
172    Ampersand,   // &
173    Caret,       // ^
174    Tilde,       // ~
175    Less,        // <
176    Greater,     // >
177    PipeGreater, // |>
178    Exclamation, // !
179    ColonEqual,  // :=
180    LArrow,      // <-
181    PlusPlus,    // ++
182    MinusMinus,  // --
183
184    // 分隔符
185    LeftParen,         // (
186    RightParen,        // )
187    LeftBracket,       // [
188    RightBracket,      // ]
189    LeftArrayBracket,  // [|
190    RightArrayBracket, // |]
191    LeftBracketBar,    // [<
192    RightBracketBar,   // >]
193    LeftBracketAngle,  // [ <
194    RightBracketAngle, // > ]
195    LeftBrace,         // {
196    RightBrace,        // }
197    LeftAngle,         // <
198    RightAngle,        // >
199
200    // 标点符号
201    Comma,       // ,
202    Semicolon,   // ;
203    Colon,       // :
204    DoubleColon, // ::
205    Dot,         // .
206    DotDot,      // ..
207    Question,    // ?
208    Underscore,  // _
209    Apostrophe,  // '
210    Backtick,    // `
211    Hash,        // #
212
213    // 注释
214    LineComment,  // //
215    BlockComment, // (* *)
216
217    // 特殊
218    Error,
219    Eof,
220}
221
222impl FSharpSyntaxKind {
223    pub fn is_keyword(&self) -> bool {
224        matches!(
225            self,
226            Self::Let
227                | Self::Rec
228                | Self::And
229                | Self::In
230                | Self::If
231                | Self::Then
232                | Self::Else
233                | Self::Elif
234                | Self::Match
235                | Self::With
236                | Self::When
237                | Self::Function
238                | Self::Fun
239                | Self::Type
240                | Self::Val
241                | Self::Mutable
242                | Self::Of
243                | Self::As
244                | Self::Module
245                | Self::Namespace
246                | Self::Open
247                | Self::Try
248                | Self::Finally
249                | Self::Exception
250                | Self::Raise
251                | Self::Failwith
252                | Self::For
253                | Self::To
254                | Self::Downto
255                | Self::Do
256                | Self::Done
257                | Self::While
258                | Self::Yield
259                | Self::Return
260                | Self::Class
261                | Self::Interface
262                | Self::Inherit
263                | Self::Abstract
264                | Self::Override
265                | Self::Default
266                | Self::Member
267                | Self::Static
268                | Self::New
269                | Self::Lazy
270                | Self::Async
271                | Self::Seq
272                | Self::Use
273                | Self::Begin
274                | Self::End
275                | Self::Struct
276                | Self::Sig
277                | Self::True
278                | Self::False
279                | Self::Null
280                | Self::Or
281                | Self::Public
282                | Self::Private
283                | Self::Internal
284                | Self::Inline
285                | Self::Extern
286                | Self::Upcast
287                | Self::Downcast
288                | Self::Assert
289        )
290    }
291}
292
293impl TokenType for FSharpSyntaxKind {
294    const END_OF_STREAM: Self = Self::Eof;
295    type Role = UniversalTokenRole;
296
297    fn role(&self) -> Self::Role {
298        match self {
299            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
300            Self::LineComment | Self::BlockComment => UniversalTokenRole::Comment,
301            Self::Identifier => UniversalTokenRole::Name,
302            Self::IntegerLiteral | Self::FloatLiteral | Self::StringLiteral | Self::CharLiteral | Self::BooleanLiteral | Self::UnitLiteral => UniversalTokenRole::Literal,
303            _ if self.is_keyword() => UniversalTokenRole::Keyword,
304            Self::Plus
305            | Self::Minus
306            | Self::Star
307            | Self::Slash
308            | Self::Percent
309            | Self::Equal
310            | Self::NotEqual
311            | Self::Less
312            | Self::Greater
313            | Self::LessEqual
314            | Self::GreaterEqual
315            | Self::Pipe
316            | Self::PipeGreater
317            | Self::Ampersand
318            | Self::Exclamation
319            | Self::ColonEqual
320            | Self::Arrow
321            | Self::LArrow
322            | Self::DoubleColon
323            | Self::PlusPlus
324            | Self::MinusMinus => UniversalTokenRole::Operator,
325            Self::LeftParen
326            | Self::RightParen
327            | Self::LeftBracket
328            | Self::RightBracket
329            | Self::LeftBrace
330            | Self::RightBrace
331            | Self::LeftBracketBar
332            | Self::RightBracketBar
333            | Self::LeftBracketAngle
334            | Self::RightBracketAngle
335            | Self::Comma
336            | Self::Semicolon
337            | Self::Colon
338            | Self::Dot
339            | Self::DotDot
340            | Self::Hash => UniversalTokenRole::Punctuation,
341            Self::Eof => UniversalTokenRole::Eof,
342            _ => UniversalTokenRole::None,
343        }
344    }
345
346    fn is_comment(&self) -> bool {
347        matches!(self, Self::LineComment | Self::BlockComment)
348    }
349
350    fn is_whitespace(&self) -> bool {
351        matches!(self, Self::Whitespace | Self::Newline)
352    }
353}
354
355impl ElementType for FSharpSyntaxKind {
356    type Role = UniversalElementRole;
357
358    fn role(&self) -> Self::Role {
359        match self {
360            Self::Root => UniversalElementRole::Root,
361            Self::Error => UniversalElementRole::Error,
362            _ => UniversalElementRole::None,
363        }
364    }
365
366    fn is_error(&self) -> bool {
367        matches!(self, Self::Error)
368    }
369
370    fn is_root(&self) -> bool {
371        matches!(self, Self::Root)
372    }
373}