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 Whitespace,
10 Newline,
11 Comment,
12
13 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 Identifier,
65 IntegerLiteral,
66 FloatLiteral,
67 StringLiteral,
68 CharLiteral,
69
70 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 LeftParen,
105 RightParen,
106 LeftBracket,
107 RightBracket,
108 LeftBrace,
109 RightBrace,
110
111 Root,
115 ModuleDef,
116 LetBinding,
117 MatchExpr,
118 FunctionDef,
119 TypeDefinition,
120 Expression,
121
122 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}