Skip to main content

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}