Skip to main content

oak_haskell/parser/
element_type.rs

1use oak_core::{ElementType, Parser, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7pub enum HaskellElementType {
8    Whitespace,
9    Newline,
10    Comment,
11    Case,
12    Class,
13    Data,
14    Default,
15    Deriving,
16    Do,
17    Else,
18    Foreign,
19    If,
20    Import,
21    In,
22    Infix,
23    Infixl,
24    Infixr,
25    Instance,
26    Let,
27    Module,
28    Newtype,
29    Of,
30    Then,
31    Type,
32    Where,
33    Underscore,
34    As,
35    Qualified,
36    Hiding,
37    Identifier,
38    Constructor,
39    Number,
40    Integer,
41    Float,
42    String,
43    StringLiteral,
44    Char,
45    CharLiteral,
46    Plus,
47    Minus,
48    Star,
49    Slash,
50    Percent,
51    Assign,
52    Equal,
53    NotEqual,
54    Less,
55    Greater,
56    LessEqual,
57    GreaterEqual,
58    And,
59    Or,
60    Arrow,
61    LeftArrow,
62    DoubleArrow,
63    Pipe,
64    Ampersand,
65    Bang,
66    Exclamation,
67    Question,
68    Colon,
69    DoubleColon,
70    Semicolon,
71    Comma,
72    Dot,
73    DoubleDot,
74    DotDot,
75    Dollar,
76    At,
77    Tilde,
78    Backslash,
79    Append,
80    LeftParen,
81    RightParen,
82    LeftBracket,
83    RightBracket,
84    LeftBrace,
85    RightBrace,
86    Quote,
87    Backquote,
88    Backtick,
89    Function,
90    DataDeclaration,
91    ModuleDeclaration,
92    Root,
93    Error,
94    Eof,
95}
96
97impl HaskellElementType {
98    pub fn is_keyword(&self) -> bool {
99        matches!(
100            self,
101            Self::Case
102                | Self::Class
103                | Self::Data
104                | Self::Default
105                | Self::Deriving
106                | Self::Do
107                | Self::Else
108                | Self::Foreign
109                | Self::If
110                | Self::Import
111                | Self::In
112                | Self::Infix
113                | Self::Infixl
114                | Self::Infixr
115                | Self::Instance
116                | Self::Let
117                | Self::Module
118                | Self::Newtype
119                | Self::Of
120                | Self::Then
121                | Self::Type
122                | Self::Where
123                | Self::As
124                | Self::Qualified
125                | Self::Hiding
126        )
127    }
128}
129
130impl oak_core::TokenType for HaskellElementType {
131    const END_OF_STREAM: Self = Self::Eof;
132    type Role = oak_core::UniversalTokenRole;
133
134    fn role(&self) -> Self::Role {
135        match self {
136            Self::Whitespace | Self::Newline => oak_core::UniversalTokenRole::Whitespace,
137            Self::Comment => oak_core::UniversalTokenRole::Comment,
138            Self::Identifier | Self::Constructor => oak_core::UniversalTokenRole::Name,
139            Self::Number | Self::Integer | Self::Float | Self::String | Self::StringLiteral | Self::Char | Self::CharLiteral => oak_core::UniversalTokenRole::Literal,
140            _ if self.is_keyword() => oak_core::UniversalTokenRole::Keyword,
141            Self::Plus
142            | Self::Minus
143            | Self::Star
144            | Self::Slash
145            | Self::Percent
146            | Self::Assign
147            | Self::Equal
148            | Self::NotEqual
149            | Self::Less
150            | Self::Greater
151            | Self::LessEqual
152            | Self::GreaterEqual
153            | Self::And
154            | Self::Or
155            | Self::Arrow
156            | Self::LeftArrow
157            | Self::DoubleArrow
158            | Self::Pipe
159            | Self::Ampersand
160            | Self::Bang
161            | Self::Exclamation
162            | Self::Question
163            | Self::Colon
164            | Self::DoubleColon
165            | Self::Dollar
166            | Self::At
167            | Self::Tilde
168            | Self::Backslash
169            | Self::Append => oak_core::UniversalTokenRole::Operator,
170            Self::Semicolon
171            | Self::Comma
172            | Self::Dot
173            | Self::DoubleDot
174            | Self::DotDot
175            | Self::LeftParen
176            | Self::RightParen
177            | Self::LeftBracket
178            | Self::RightBracket
179            | Self::LeftBrace
180            | Self::RightBrace
181            | Self::Underscore
182            | Self::Quote
183            | Self::Backquote
184            | Self::Backtick => oak_core::UniversalTokenRole::Punctuation,
185            Self::Eof => oak_core::UniversalTokenRole::Eof,
186            _ => oak_core::UniversalTokenRole::None,
187        }
188    }
189
190    fn is_ignored(&self) -> bool {
191        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
192    }
193
194    fn is_comment(&self) -> bool {
195        matches!(self, Self::Comment)
196    }
197
198    fn is_whitespace(&self) -> bool {
199        matches!(self, Self::Whitespace | Self::Newline)
200    }
201}
202
203impl ElementType for HaskellElementType {
204    type Role = UniversalElementRole;
205
206    fn role(&self) -> Self::Role {
207        match self {
208            Self::Root => UniversalElementRole::Root,
209
210            Self::Error => UniversalElementRole::Error,
211            _ => UniversalElementRole::None,
212        }
213    }
214}
215
216impl From<crate::lexer::token_type::HaskellTokenType> for HaskellElementType {
217    fn from(token: crate::lexer::token_type::HaskellTokenType) -> Self {
218        unsafe { std::mem::transmute(token) }
219    }
220}