Skip to main content

oak_julia/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2use std::{fmt, str::FromStr};
3
4/// Element types for the Julia language.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub enum JuliaElementType {
8    /// Root node of the parse tree.
9    Root,
10    // Keywords
11    /// `if` keyword.
12    If,
13    /// `elseif` keyword.
14    ElseIf,
15    /// `else` keyword.
16    Else,
17    /// `for` keyword.
18    For,
19    /// `while` keyword.
20    While,
21    /// `break` keyword.
22    Break,
23    /// `continue` keyword.
24    Continue,
25    /// `function` keyword.
26    Function,
27    /// `end` keyword.
28    End,
29    /// `begin` keyword.
30    Begin,
31    /// `module` keyword.
32    Module,
33    /// `using` keyword.
34    Using,
35    /// `import` keyword.
36    Import,
37    /// `export` keyword.
38    Export,
39    /// `const` keyword.
40    Const,
41    /// `local` keyword.
42    Local,
43    /// `global` keyword.
44    Global,
45    /// `true` keyword.
46    True,
47    /// `false` keyword.
48    False,
49    /// `nothing` keyword.
50    Nothing,
51    /// `return` keyword.
52    Return,
53
54    // Operators
55    /// `+` operator.
56    Plus,
57    /// `-` operator.
58    Minus,
59    /// `*` operator.
60    Star,
61    /// `/` operator.
62    Slash,
63    /// `%` operator.
64    Percent,
65    /// `^` operator.
66    Caret,
67    /// `==` operator.
68    Equal,
69    /// `!=` operator.
70    NotEqual,
71    /// `<` operator.
72    LessThan,
73    /// `>` operator.
74    GreaterThan,
75    /// `<=` operator.
76    LessEqual,
77    /// `>=` operator.
78    GreaterEqual,
79    /// `=` operator.
80    Assign,
81    /// `+=` operator.
82    PlusAssign,
83    /// `-=` operator.
84    MinusAssign,
85    /// `*=` operator.
86    StarAssign,
87    /// `/=` operator.
88    SlashAssign,
89    /// `%=` operator.
90    PercentAssign,
91    /// `^=` operator.
92    CaretAssign,
93    /// `&&` operator.
94    And,
95    /// `||` operator.
96    Or,
97    /// `!` operator.
98    Not,
99    /// `:` operator.
100    Colon,
101    /// `.` operator.
102    Dot,
103    /// `:` operator (range).
104    Range,
105    /// `->` operator.
106    Arrow,
107    /// `=>` operator.
108    FatArrow,
109    /// `&` operator.
110    BitAnd,
111    /// `|` operator.
112    BitOr,
113    /// `xor` or `⊻` operator.
114    BitXor,
115    /// `~` operator.
116    BitNot,
117    /// `<<` operator.
118    LeftShift,
119    /// `>>` operator.
120    RightShift,
121
122    // Delimiters
123    /// `(` delimiter.
124    LeftParen,
125    /// `)` delimiter.
126    RightParen,
127    /// `[` delimiter.
128    LeftBracket,
129    /// `]` delimiter.
130    RightBracket,
131    /// `{` delimiter.
132    LeftBrace,
133    /// `}` delimiter.
134    RightBrace,
135    /// `,` delimiter.
136    Comma,
137    /// `;` delimiter.
138    Semicolon,
139
140    // Literals
141    /// Integer literal.
142    IntegerLiteral,
143    /// Floating-point literal.
144    FloatLiteral,
145    /// String literal.
146    StringLiteral,
147    /// Character literal.
148    CharLiteral,
149    /// Boolean literal.
150    BooleanLiteral,
151    /// Nothing literal.
152    NothingLiteral,
153
154    // Other
155    /// Identifier.
156    Identifier,
157    /// Function call.
158    Call,
159    /// List of arguments.
160    ArgumentList,
161    /// Comment.
162    Comment,
163    /// Whitespace.
164    Whitespace,
165    /// Newline.
166    Newline,
167    /// End of file.
168    Eof,
169    /// Error element.
170    Error,
171    /// Invalid element.
172    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    /// Returns the string representation of the element type.
208    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    /// Returns true if the element is a trivia element (whitespace, comment, or newline).
292    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}