1use oak_core::{ElementType, UniversalElementRole};
2use std::{fmt, str::FromStr};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub enum JuliaElementType {
8 Root,
10 If,
13 ElseIf,
15 Else,
17 For,
19 While,
21 Break,
23 Continue,
25 Function,
27 End,
29 Begin,
31 Module,
33 Using,
35 Import,
37 Export,
39 Const,
41 Local,
43 Global,
45 True,
47 False,
49 Nothing,
51 Return,
53
54 Plus,
57 Minus,
59 Star,
61 Slash,
63 Percent,
65 Caret,
67 Equal,
69 NotEqual,
71 LessThan,
73 GreaterThan,
75 LessEqual,
77 GreaterEqual,
79 Assign,
81 PlusAssign,
83 MinusAssign,
85 StarAssign,
87 SlashAssign,
89 PercentAssign,
91 CaretAssign,
93 And,
95 Or,
97 Not,
99 Colon,
101 Dot,
103 Range,
105 Arrow,
107 FatArrow,
109 BitAnd,
111 BitOr,
113 BitXor,
115 BitNot,
117 LeftShift,
119 RightShift,
121
122 LeftParen,
125 RightParen,
127 LeftBracket,
129 RightBracket,
131 LeftBrace,
133 RightBrace,
135 Comma,
137 Semicolon,
139
140 IntegerLiteral,
143 FloatLiteral,
145 StringLiteral,
147 CharLiteral,
149 BooleanLiteral,
151 NothingLiteral,
153
154 Identifier,
157 Call,
159 ArgumentList,
161 Comment,
163 Whitespace,
165 Newline,
167 Eof,
169 Error,
171 Invalid,
173}
174
175impl FromStr for JuliaElementType {
176 type Err = ();
177
178 fn from_str(s: &str) -> Result<Self, Self::Err> {
179 match s {
180 "if" => Ok(JuliaElementType::If),
181 "elseif" => Ok(JuliaElementType::ElseIf),
182 "else" => Ok(JuliaElementType::Else),
183 "for" => Ok(JuliaElementType::For),
184 "while" => Ok(JuliaElementType::While),
185 "break" => Ok(JuliaElementType::Break),
186 "continue" => Ok(JuliaElementType::Continue),
187 "function" => Ok(JuliaElementType::Function),
188 "end" => Ok(JuliaElementType::End),
189 "begin" => Ok(JuliaElementType::Begin),
190 "module" => Ok(JuliaElementType::Module),
191 "using" => Ok(JuliaElementType::Using),
192 "import" => Ok(JuliaElementType::Import),
193 "export" => Ok(JuliaElementType::Export),
194 "const" => Ok(JuliaElementType::Const),
195 "local" => Ok(JuliaElementType::Local),
196 "global" => Ok(JuliaElementType::Global),
197 "true" => Ok(JuliaElementType::True),
198 "false" => Ok(JuliaElementType::False),
199 "nothing" => Ok(JuliaElementType::Nothing),
200 "return" => Ok(JuliaElementType::Return),
201 _ => Err(()),
202 }
203 }
204}
205
206impl JuliaElementType {
207 pub fn as_str(&self) -> &'static str {
209 match self {
210 JuliaElementType::Root => "root",
211 JuliaElementType::If => "if",
212 JuliaElementType::ElseIf => "elseif",
213 JuliaElementType::Else => "else",
214 JuliaElementType::For => "for",
215 JuliaElementType::While => "while",
216 JuliaElementType::Break => "break",
217 JuliaElementType::Continue => "continue",
218 JuliaElementType::Function => "function",
219 JuliaElementType::End => "end",
220 JuliaElementType::Begin => "begin",
221 JuliaElementType::Module => "module",
222 JuliaElementType::Using => "using",
223 JuliaElementType::Import => "import",
224 JuliaElementType::Export => "export",
225 JuliaElementType::Const => "const",
226 JuliaElementType::Local => "local",
227 JuliaElementType::Global => "global",
228 JuliaElementType::True => "true",
229 JuliaElementType::False => "false",
230 JuliaElementType::Nothing => "nothing",
231 JuliaElementType::Return => "return",
232 JuliaElementType::Plus => "+",
233 JuliaElementType::Minus => "-",
234 JuliaElementType::Star => "*",
235 JuliaElementType::Slash => "/",
236 JuliaElementType::Percent => "%",
237 JuliaElementType::Caret => "^",
238 JuliaElementType::Equal => "==",
239 JuliaElementType::NotEqual => "!=",
240 JuliaElementType::LessThan => "<",
241 JuliaElementType::GreaterThan => ">",
242 JuliaElementType::LessEqual => "<=",
243 JuliaElementType::GreaterEqual => ">=",
244 JuliaElementType::Assign => "=",
245 JuliaElementType::PlusAssign => "+=",
246 JuliaElementType::MinusAssign => "-=",
247 JuliaElementType::StarAssign => "*=",
248 JuliaElementType::SlashAssign => "/=",
249 JuliaElementType::PercentAssign => "%=",
250 JuliaElementType::CaretAssign => "^=",
251 JuliaElementType::And => "&&",
252 JuliaElementType::Or => "||",
253 JuliaElementType::Not => "!",
254 JuliaElementType::Colon => ":",
255 JuliaElementType::Dot => ".",
256 JuliaElementType::Range => "..",
257 JuliaElementType::Arrow => "->",
258 JuliaElementType::FatArrow => "=>",
259 JuliaElementType::BitAnd => "&",
260 JuliaElementType::BitOr => "|",
261 JuliaElementType::BitXor => "^",
262 JuliaElementType::BitNot => "~",
263 JuliaElementType::LeftShift => "<<",
264 JuliaElementType::RightShift => ">>",
265 JuliaElementType::LeftParen => "(",
266 JuliaElementType::RightParen => ")",
267 JuliaElementType::LeftBracket => "[",
268 JuliaElementType::RightBracket => "]",
269 JuliaElementType::LeftBrace => "{",
270 JuliaElementType::RightBrace => "}",
271 JuliaElementType::Comma => ",",
272 JuliaElementType::Semicolon => ";",
273 JuliaElementType::IntegerLiteral => "integer",
274 JuliaElementType::FloatLiteral => "float",
275 JuliaElementType::StringLiteral => "string",
276 JuliaElementType::CharLiteral => "char",
277 JuliaElementType::BooleanLiteral => "boolean",
278 JuliaElementType::NothingLiteral => "nothing_lit",
279 JuliaElementType::Identifier => "identifier",
280 JuliaElementType::Call => "call",
281 JuliaElementType::ArgumentList => "argument_list",
282 JuliaElementType::Comment => "comment",
283 JuliaElementType::Whitespace => "whitespace",
284 JuliaElementType::Newline => "newline",
285 JuliaElementType::Eof => "eof",
286 JuliaElementType::Error => "error",
287 JuliaElementType::Invalid => "invalid",
288 }
289 }
290
291 pub fn is_trivia(&self) -> bool {
293 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
294 }
295}
296
297impl fmt::Display for JuliaElementType {
298 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
299 write!(f, "{}", self.as_str())
300 }
301}
302
303impl ElementType for JuliaElementType {
304 type Role = UniversalElementRole;
305
306 fn role(&self) -> Self::Role {
307 match self {
308 _ => UniversalElementRole::None,
309 }
310 }
311}
312
313impl From<crate::lexer::token_type::JuliaTokenType> for JuliaElementType {
314 fn from(token: crate::lexer::token_type::JuliaTokenType) -> Self {
315 unsafe { std::mem::transmute(token) }
316 }
317}