1use crate::lexer::MojoTokenType;
2use oak_core::UniversalElementRole;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub enum MojoElementType {
7 Fn,
9 Struct,
10 Var,
11 Let,
12 If,
13 Else,
14 While,
15 For,
16 In,
17 Return,
18 Break,
19 Continue,
20 Import,
21 From,
22 True,
23 False,
24 None,
25 Identifier,
26 Integer,
27 Float,
28 String,
29 Plus,
30 Minus,
31 Star,
32 Slash,
33 Percent,
34 Equal,
35 EqualEqual,
36 NotEqual,
37 Less,
38 LessEqual,
39 Greater,
40 GreaterEqual,
41 And,
42 Or,
43 Not,
44 LeftParen,
45 RightParen,
46 LeftBracket,
47 RightBracket,
48 LeftBrace,
49 RightBrace,
50 Comma,
51 Dot,
52 Colon,
53 Semicolon,
54 Arrow,
55 Whitespace,
56 Newline,
57 Comment,
58 Indent,
59 Dedent,
60 EndOfStream,
61
62 FunctionDef,
64 StructDef,
65 VariableDecl,
66 Assignment,
67 IfStatement,
68 WhileStatement,
69 ForStatement,
70 ReturnStatement,
71 ExpressionStatement,
72
73 BinaryExpr,
75 UnaryExpr,
76 CallExpr,
77 LiteralExpr,
78 IdentifierExpr,
79 MemberExpr,
80 ListExpr,
81
82 ParamList,
84 ArgList,
85 Block,
86
87 Root,
89 Grouping,
90 Error,
91}
92
93impl MojoElementType {
94 pub fn is_trivia(&self) -> bool {
96 matches!(self, MojoElementType::Whitespace | MojoElementType::Newline | MojoElementType::Comment)
97 }
98}
99
100impl From<MojoTokenType> for MojoElementType {
101 fn from(token: MojoTokenType) -> Self {
102 match token {
103 MojoTokenType::Fn => MojoElementType::Fn,
104 MojoTokenType::Struct => MojoElementType::Struct,
105 MojoTokenType::Var => MojoElementType::Var,
106 MojoTokenType::Let => MojoElementType::Let,
107 MojoTokenType::If => MojoElementType::If,
108 MojoTokenType::Else => MojoElementType::Else,
109 MojoTokenType::While => MojoElementType::While,
110 MojoTokenType::For => MojoElementType::For,
111 MojoTokenType::In => MojoElementType::In,
112 MojoTokenType::Return => MojoElementType::Return,
113 MojoTokenType::Break => MojoElementType::Break,
114 MojoTokenType::Continue => MojoElementType::Continue,
115 MojoTokenType::Import => MojoElementType::Import,
116 MojoTokenType::From => MojoElementType::From,
117 MojoTokenType::True => MojoElementType::True,
118 MojoTokenType::False => MojoElementType::False,
119 MojoTokenType::None => MojoElementType::None,
120 MojoTokenType::Identifier => MojoElementType::Identifier,
121 MojoTokenType::Integer => MojoElementType::Integer,
122 MojoTokenType::Float => MojoElementType::Float,
123 MojoTokenType::String => MojoElementType::String,
124 MojoTokenType::Plus => MojoElementType::Plus,
125 MojoTokenType::Minus => MojoElementType::Minus,
126 MojoTokenType::Star => MojoElementType::Star,
127 MojoTokenType::Slash => MojoElementType::Slash,
128 MojoTokenType::Percent => MojoElementType::Percent,
129 MojoTokenType::Equal => MojoElementType::Equal,
130 MojoTokenType::EqualEqual => MojoElementType::EqualEqual,
131 MojoTokenType::NotEqual => MojoElementType::NotEqual,
132 MojoTokenType::Less => MojoElementType::Less,
133 MojoTokenType::LessEqual => MojoElementType::LessEqual,
134 MojoTokenType::Greater => MojoElementType::Greater,
135 MojoTokenType::GreaterEqual => MojoElementType::GreaterEqual,
136 MojoTokenType::And => MojoElementType::And,
137 MojoTokenType::Or => MojoElementType::Or,
138 MojoTokenType::Not => MojoElementType::Not,
139 MojoTokenType::LeftParen => MojoElementType::LeftParen,
140 MojoTokenType::RightParen => MojoElementType::RightParen,
141 MojoTokenType::LeftBracket => MojoElementType::LeftBracket,
142 MojoTokenType::RightBracket => MojoElementType::RightBracket,
143 MojoTokenType::LeftBrace => MojoElementType::LeftBrace,
144 MojoTokenType::RightBrace => MojoElementType::RightBrace,
145 MojoTokenType::Comma => MojoElementType::Comma,
146 MojoTokenType::Dot => MojoElementType::Dot,
147 MojoTokenType::Colon => MojoElementType::Colon,
148 MojoTokenType::Semicolon => MojoElementType::Semicolon,
149 MojoTokenType::Arrow => MojoElementType::Arrow,
150 MojoTokenType::Whitespace => MojoElementType::Whitespace,
151 MojoTokenType::Newline => MojoElementType::Newline,
152 MojoTokenType::Comment => MojoElementType::Comment,
153 MojoTokenType::Indent => MojoElementType::Indent,
154 MojoTokenType::Dedent => MojoElementType::Dedent,
155 MojoTokenType::EndOfStream => MojoElementType::EndOfStream,
156 MojoTokenType::Error => MojoElementType::Error,
157 }
158 }
159}
160
161impl oak_core::ElementType for MojoElementType {
162 type Role = UniversalElementRole;
163
164 fn role(&self) -> Self::Role {
165 UniversalElementRole::None
166 }
167}