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}