oak_haskell/parser/element_type.rs
1use oak_core::{ElementType, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5/// Represents an element type in a Haskell source file.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8pub enum HaskellElementType {
9 /// Whitespace characters.
10 Whitespace,
11 /// A newline character.
12 Newline,
13 /// A comment.
14 Comment,
15 /// 'case' keyword.
16 Case,
17 /// 'class' keyword.
18 Class,
19 /// 'data' keyword.
20 Data,
21 /// 'default' keyword.
22 Default,
23 /// 'deriving' keyword.
24 Deriving,
25 /// 'do' keyword.
26 Do,
27 /// 'else' keyword.
28 Else,
29 /// 'foreign' keyword.
30 Foreign,
31 /// 'if' keyword.
32 If,
33 /// 'import' keyword.
34 Import,
35 /// 'in' keyword.
36 In,
37 /// 'infix' keyword.
38 Infix,
39 /// 'infixl' keyword.
40 Infixl,
41 /// 'infixr' keyword.
42 Infixr,
43 /// 'instance' keyword.
44 Instance,
45 /// 'let' keyword.
46 Let,
47 /// 'module' keyword.
48 Module,
49 /// 'newtype' keyword.
50 Newtype,
51 /// 'of' keyword.
52 Of,
53 /// 'then' keyword.
54 Then,
55 /// 'type' keyword.
56 Type,
57 /// 'where' keyword.
58 Where,
59 /// Underscore character (_).
60 Underscore,
61 /// 'as' keyword.
62 As,
63 /// 'qualified' keyword.
64 Qualified,
65 /// 'hiding' keyword.
66 Hiding,
67 /// An identifier.
68 Identifier,
69 /// A constructor identifier.
70 Constructor,
71 /// A numeric literal.
72 Number,
73 /// An integer literal.
74 Integer,
75 /// A floating-point literal.
76 Float,
77 /// A string literal.
78 String,
79 /// A string literal.
80 StringLiteral,
81 /// A character literal.
82 Char,
83 /// A character literal.
84 CharLiteral,
85 /// Plus operator (+).
86 Plus,
87 /// Minus operator (-).
88 Minus,
89 /// Multiplication operator (*).
90 Star,
91 /// Division operator (/).
92 Slash,
93 /// Modulo operator (%).
94 Percent,
95 /// Assignment operator (=).
96 Assign,
97 /// Equality operator (==).
98 Equal,
99 /// Inequality operator (/=).
100 NotEqual,
101 /// Less than operator (<).
102 Less,
103 /// Greater than operator (>).
104 Greater,
105 /// Less than or equal to operator (<=).
106 LessEqual,
107 /// Greater than or equal to operator (>=).
108 GreaterEqual,
109 /// Logical AND operator (&&).
110 And,
111 /// Logical OR operator (||).
112 Or,
113 /// Function arrow operator (->).
114 Arrow,
115 /// Left arrow operator (<-).
116 LeftArrow,
117 /// Double arrow operator (=>).
118 DoubleArrow,
119 /// Pipe character (|).
120 Pipe,
121 /// Ampersand character (&).
122 Ampersand,
123 /// Bang operator (!).
124 Bang,
125 /// Exclamation mark (!).
126 Exclamation,
127 /// Question mark (?).
128 Question,
129 /// Colon character (:).
130 Colon,
131 /// Double colon character (::).
132 DoubleColon,
133 /// Semicolon character (;).
134 Semicolon,
135 /// Comma character (,).
136 Comma,
137 /// Dot character (.).
138 Dot,
139 /// Double dot character (..).
140 DoubleDot,
141 /// Range operator (..).
142 DotDot,
143 /// Dollar sign ($).
144 Dollar,
145 /// At sign (@).
146 At,
147 /// Tilde character (~).
148 Tilde,
149 /// Backslash character (\).
150 Backslash,
151 /// Append operator (++).
152 Append,
153 /// Left parenthesis (().
154 LeftParen,
155 /// Right parenthesis ()).
156 RightParen,
157 /// Left bracket ([).
158 LeftBracket,
159 /// Right bracket (]).
160 RightBracket,
161 /// Left brace ({).
162 LeftBrace,
163 /// Right brace (}).
164 RightBrace,
165 /// Single quote (').
166 Quote,
167 /// Backquote (`).
168 Backquote,
169 /// Backtick (`).
170 Backtick,
171 /// A function definition.
172 Function,
173 /// A data declaration.
174 DataDeclaration,
175 /// A module declaration.
176 ModuleDeclaration,
177 /// An import declaration.
178 ImportDeclaration,
179 /// A type alias declaration.
180 TypeAliasDeclaration,
181 /// A type signature.
182 TypeSignature,
183 /// A function equation.
184 Equation,
185 /// A pattern.
186 Pattern,
187 /// A literal expression.
188 LiteralExpression,
189 /// An identifier expression.
190 IdentifierExpression,
191 /// A prefix expression.
192 PrefixExpression,
193 /// An infix expression.
194 InfixExpression,
195 /// A function application.
196 ApplicationExpression,
197 /// A lambda expression.
198 LambdaExpression,
199 /// A let expression.
200 LetExpression,
201 /// A case expression.
202 CaseExpression,
203 /// A case arm.
204 CaseArm,
205 /// A type expression.
206 TypeExpr,
207 /// Root node of the AST.
208 Root,
209 /// Error node.
210 Error,
211 /// End of file marker.
212 Eof,
213}
214
215impl HaskellElementType {
216 /// Returns true if the element type is a Haskell keyword.
217 pub fn is_keyword(&self) -> bool {
218 matches!(
219 self,
220 Self::Case
221 | Self::Class
222 | Self::Data
223 | Self::Default
224 | Self::Deriving
225 | Self::Do
226 | Self::Else
227 | Self::Foreign
228 | Self::If
229 | Self::Import
230 | Self::In
231 | Self::Infix
232 | Self::Infixl
233 | Self::Infixr
234 | Self::Instance
235 | Self::Let
236 | Self::Module
237 | Self::Newtype
238 | Self::Of
239 | Self::Then
240 | Self::Type
241 | Self::Where
242 | Self::As
243 | Self::Qualified
244 | Self::Hiding
245 )
246 }
247}
248
249impl oak_core::TokenType for HaskellElementType {
250 const END_OF_STREAM: Self = Self::Eof;
251 type Role = oak_core::UniversalTokenRole;
252
253 fn role(&self) -> Self::Role {
254 match self {
255 Self::Whitespace | Self::Newline => oak_core::UniversalTokenRole::Whitespace,
256 Self::Comment => oak_core::UniversalTokenRole::Comment,
257 Self::Identifier | Self::Constructor => oak_core::UniversalTokenRole::Name,
258 Self::Number | Self::Integer | Self::Float | Self::String | Self::StringLiteral | Self::Char | Self::CharLiteral => oak_core::UniversalTokenRole::Literal,
259 _ if self.is_keyword() => oak_core::UniversalTokenRole::Keyword,
260 Self::Plus
261 | Self::Minus
262 | Self::Star
263 | Self::Slash
264 | Self::Percent
265 | Self::Assign
266 | Self::Equal
267 | Self::NotEqual
268 | Self::Less
269 | Self::Greater
270 | Self::LessEqual
271 | Self::GreaterEqual
272 | Self::And
273 | Self::Or
274 | Self::Arrow
275 | Self::LeftArrow
276 | Self::DoubleArrow
277 | Self::Pipe
278 | Self::Ampersand
279 | Self::Bang
280 | Self::Exclamation
281 | Self::Question
282 | Self::Colon
283 | Self::DoubleColon
284 | Self::Dollar
285 | Self::At
286 | Self::Tilde
287 | Self::Backslash
288 | Self::Append => oak_core::UniversalTokenRole::Operator,
289 Self::Semicolon
290 | Self::Comma
291 | Self::Dot
292 | Self::DoubleDot
293 | Self::DotDot
294 | Self::LeftParen
295 | Self::RightParen
296 | Self::LeftBracket
297 | Self::RightBracket
298 | Self::LeftBrace
299 | Self::RightBrace
300 | Self::Underscore
301 | Self::Quote
302 | Self::Backquote
303 | Self::Backtick => oak_core::UniversalTokenRole::Punctuation,
304 Self::Eof => oak_core::UniversalTokenRole::Eof,
305 _ => oak_core::UniversalTokenRole::None,
306 }
307 }
308
309 fn is_ignored(&self) -> bool {
310 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
311 }
312
313 fn is_comment(&self) -> bool {
314 matches!(self, Self::Comment)
315 }
316
317 fn is_whitespace(&self) -> bool {
318 matches!(self, Self::Whitespace | Self::Newline)
319 }
320}
321
322impl ElementType for HaskellElementType {
323 type Role = UniversalElementRole;
324
325 fn role(&self) -> Self::Role {
326 match self {
327 Self::Root => UniversalElementRole::Root,
328
329 Self::Error => UniversalElementRole::Error,
330 _ => UniversalElementRole::None,
331 }
332 }
333}
334
335impl From<crate::lexer::token_type::HaskellTokenType> for HaskellElementType {
336 fn from(token: crate::lexer::token_type::HaskellTokenType) -> Self {
337 unsafe { std::mem::transmute(token) }
338 }
339}