Skip to main content

oak_ocaml/kind/
mod.rs

1use oak_core::{ElementType, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4pub type OCamlToken = Token<OCamlSyntaxKind>;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub enum OCamlSyntaxKind {
8    // 空白和注释
9    Whitespace,
10    Newline,
11    Comment,
12
13    // 关键字
14    And,
15    As,
16    Assert,
17    Begin,
18    Class,
19    Constraint,
20    Do,
21    Done,
22    Downto,
23    Else,
24    End,
25    Exception,
26    External,
27    False,
28    For,
29    Fun,
30    Function,
31    Functor,
32    If,
33    In,
34    Include,
35    Inherit,
36    Initializer,
37    Lazy,
38    Let,
39    Match,
40    Method,
41    Module,
42    Mutable,
43    New,
44    Object,
45    Of,
46    Open,
47    Or,
48    Private,
49    Rec,
50    Sig,
51    Struct,
52    Then,
53    To,
54    True,
55    Try,
56    Type,
57    Val,
58    Virtual,
59    When,
60    While,
61    With,
62
63    // 标识符和字面量
64    Identifier,
65    IntegerLiteral,
66    FloatLiteral,
67    StringLiteral,
68    CharLiteral,
69
70    // 操作符
71    Plus,
72    Minus,
73    Star,
74    Slash,
75    Percent,
76    Equal,
77    EqualEqual,
78    NotEqual,
79    Less,
80    Greater,
81    LessEqual,
82    GreaterEqual,
83    LeftArrow,
84    RightArrow,
85    OrOr,
86    AndAnd,
87    ColonColon,
88    Pipe,
89    Ampersand,
90    Bang,
91    Question,
92    Colon,
93    Semicolon,
94    Comma,
95    Dot,
96    Caret,
97    Tilde,
98    At,
99    Hash,
100    Dollar,
101    Backtick,
102
103    // 分隔符
104    LeftParen,
105    RightParen,
106    LeftBracket,
107    RightBracket,
108    LeftBrace,
109    RightBrace,
110
111    // 特殊
112
113    // Element kinds
114    Root,
115    ModuleDef,
116    LetBinding,
117    MatchExpr,
118    FunctionDef,
119    TypeDefinition,
120    Expression,
121
122    // 错误和结束
123    Error,
124    Eof,
125}
126
127impl TokenType for OCamlSyntaxKind {
128    const END_OF_STREAM: Self = Self::Eof;
129    type Role = UniversalTokenRole;
130
131    fn role(&self) -> Self::Role {
132        match self {
133            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
134            Self::Comment => UniversalTokenRole::Comment,
135            Self::Eof => UniversalTokenRole::Eof,
136            _ => UniversalTokenRole::None,
137        }
138    }
139
140    fn is_comment(&self) -> bool {
141        matches!(self, Self::Comment)
142    }
143
144    fn is_whitespace(&self) -> bool {
145        matches!(self, Self::Whitespace | Self::Newline)
146    }
147}
148
149impl ElementType for OCamlSyntaxKind {
150    type Role = UniversalElementRole;
151
152    fn role(&self) -> Self::Role {
153        match self {
154            Self::Error => UniversalElementRole::Error,
155            Self::Root => UniversalElementRole::Root,
156            Self::ModuleDef | Self::LetBinding | Self::TypeDefinition => UniversalElementRole::Detail,
157            _ => UniversalElementRole::None,
158        }
159    }
160}