1use crate::lexer::MojoTokenType;
2use oak_core::UniversalElementRole;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub enum MojoElementType {
12 Fn,
15 Struct,
17 Var,
19 Let,
21 If,
23 Else,
25 While,
27 For,
29 In,
31 Return,
33 Break,
35 Continue,
37 Import,
39 From,
41 True,
43 False,
45 None,
47 Identifier,
49 Integer,
51 Float,
53 String,
55 Plus,
57 Minus,
59 Star,
61 Slash,
63 Percent,
65 Equal,
67 EqualEqual,
69 NotEqual,
71 Less,
73 LessEqual,
75 Greater,
77 GreaterEqual,
79 And,
81 Or,
83 Not,
85 LeftParen,
87 RightParen,
89 LeftBracket,
91 RightBracket,
93 LeftBrace,
95 RightBrace,
97 Comma,
99 Dot,
101 Colon,
103 Semicolon,
105 Arrow,
107 Whitespace,
109 Newline,
111 Comment,
113 Indent,
115 Dedent,
117 EndOfStream,
119
120 FunctionDef,
123 StructDef,
125 VariableDecl,
127 Assignment,
129 IfStatement,
131 WhileStatement,
133 ForStatement,
135 ReturnStatement,
137 ExpressionStatement,
139
140 BinaryExpr,
143 UnaryExpr,
145 CallExpr,
147 LiteralExpr,
149 IdentifierExpr,
151 MemberExpr,
153 ListExpr,
155
156 ParamList,
159 ArgList,
161 Block,
163
164 Root,
167 Grouping,
169 Error,
171}
172
173impl MojoElementType {
174 pub fn is_trivia(&self) -> bool {
176 matches!(self, MojoElementType::Whitespace | MojoElementType::Newline | MojoElementType::Comment)
177 }
178}
179
180impl From<MojoTokenType> for MojoElementType {
181 fn from(token: MojoTokenType) -> Self {
182 match token {
183 MojoTokenType::Fn => MojoElementType::Fn,
184 MojoTokenType::Struct => MojoElementType::Struct,
185 MojoTokenType::Var => MojoElementType::Var,
186 MojoTokenType::Let => MojoElementType::Let,
187 MojoTokenType::If => MojoElementType::If,
188 MojoTokenType::Else => MojoElementType::Else,
189 MojoTokenType::While => MojoElementType::While,
190 MojoTokenType::For => MojoElementType::For,
191 MojoTokenType::In => MojoElementType::In,
192 MojoTokenType::Return => MojoElementType::Return,
193 MojoTokenType::Break => MojoElementType::Break,
194 MojoTokenType::Continue => MojoElementType::Continue,
195 MojoTokenType::Import => MojoElementType::Import,
196 MojoTokenType::From => MojoElementType::From,
197 MojoTokenType::True => MojoElementType::True,
198 MojoTokenType::False => MojoElementType::False,
199 MojoTokenType::None => MojoElementType::None,
200 MojoTokenType::Identifier => MojoElementType::Identifier,
201 MojoTokenType::Integer => MojoElementType::Integer,
202 MojoTokenType::Float => MojoElementType::Float,
203 MojoTokenType::String => MojoElementType::String,
204 MojoTokenType::Plus => MojoElementType::Plus,
205 MojoTokenType::Minus => MojoElementType::Minus,
206 MojoTokenType::Star => MojoElementType::Star,
207 MojoTokenType::Slash => MojoElementType::Slash,
208 MojoTokenType::Percent => MojoElementType::Percent,
209 MojoTokenType::Equal => MojoElementType::Equal,
210 MojoTokenType::EqualEqual => MojoElementType::EqualEqual,
211 MojoTokenType::NotEqual => MojoElementType::NotEqual,
212 MojoTokenType::Less => MojoElementType::Less,
213 MojoTokenType::LessEqual => MojoElementType::LessEqual,
214 MojoTokenType::Greater => MojoElementType::Greater,
215 MojoTokenType::GreaterEqual => MojoElementType::GreaterEqual,
216 MojoTokenType::And => MojoElementType::And,
217 MojoTokenType::Or => MojoElementType::Or,
218 MojoTokenType::Not => MojoElementType::Not,
219 MojoTokenType::LeftParen => MojoElementType::LeftParen,
220 MojoTokenType::RightParen => MojoElementType::RightParen,
221 MojoTokenType::LeftBracket => MojoElementType::LeftBracket,
222 MojoTokenType::RightBracket => MojoElementType::RightBracket,
223 MojoTokenType::LeftBrace => MojoElementType::LeftBrace,
224 MojoTokenType::RightBrace => MojoElementType::RightBrace,
225 MojoTokenType::Comma => MojoElementType::Comma,
226 MojoTokenType::Dot => MojoElementType::Dot,
227 MojoTokenType::Colon => MojoElementType::Colon,
228 MojoTokenType::Semicolon => MojoElementType::Semicolon,
229 MojoTokenType::Arrow => MojoElementType::Arrow,
230 MojoTokenType::Whitespace => MojoElementType::Whitespace,
231 MojoTokenType::Newline => MojoElementType::Newline,
232 MojoTokenType::Comment => MojoElementType::Comment,
233 MojoTokenType::Indent => MojoElementType::Indent,
234 MojoTokenType::Dedent => MojoElementType::Dedent,
235 MojoTokenType::EndOfStream => MojoElementType::EndOfStream,
236 MojoTokenType::Error => MojoElementType::Error,
237 }
238 }
239}
240
241impl oak_core::ElementType for MojoElementType {
242 type Role = UniversalElementRole;
243
244 fn role(&self) -> Self::Role {
245 UniversalElementRole::None
246 }
247}