1use core::{fmt, range::Range};
2use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
7pub struct JuliaToken {
8 pub kind: JuliaSyntaxKind,
9 #[serde(with = "oak_core::serde_range")]
10 pub span: Range<usize>,
11}
12
13use core::str::FromStr;
14
15#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize, Hash)]
17pub enum JuliaSyntaxKind {
18 Root,
19 If,
21 ElseIf,
22 Else,
23 For,
24 While,
25 Break,
26 Continue,
27 Function,
28 End,
29 Begin,
30 Module,
31 Using,
32 Import,
33 Export,
34 Const,
35 Local,
36 Global,
37 True,
38 False,
39 Nothing,
40 Return,
41
42 Plus,
44 Minus,
45 Star,
46 Slash,
47 Percent,
48 Caret,
49 Equal,
50 NotEqual,
51 LessThan,
52 GreaterThan,
53 LessEqual,
54 GreaterEqual,
55 Assign,
56 PlusAssign,
57 MinusAssign,
58 StarAssign,
59 SlashAssign,
60 PercentAssign,
61 CaretAssign,
62 And,
63 Or,
64 Not,
65 Colon,
66 Dot,
67 Range,
68 Arrow,
69 FatArrow,
70 BitAnd,
71 BitOr,
72 BitXor,
73 BitNot,
74 LeftShift,
75 RightShift,
76
77 LeftParen,
79 RightParen,
80 LeftBracket,
81 RightBracket,
82 LeftBrace,
83 RightBrace,
84 Comma,
85 Semicolon,
86
87 IntegerLiteral,
89 FloatLiteral,
90 StringLiteral,
91 CharLiteral,
92 BooleanLiteral,
93 NothingLiteral,
94
95 Identifier,
97 Comment,
98 Whitespace,
99 Newline,
100 Eof,
101 Error,
102 Invalid,
103}
104
105impl FromStr for JuliaSyntaxKind {
106 type Err = ();
107
108 fn from_str(s: &str) -> Result<Self, Self::Err> {
109 match s {
110 "if" => Ok(JuliaSyntaxKind::If),
111 "elseif" => Ok(JuliaSyntaxKind::ElseIf),
112 "else" => Ok(JuliaSyntaxKind::Else),
113 "for" => Ok(JuliaSyntaxKind::For),
114 "while" => Ok(JuliaSyntaxKind::While),
115 "break" => Ok(JuliaSyntaxKind::Break),
116 "continue" => Ok(JuliaSyntaxKind::Continue),
117 "function" => Ok(JuliaSyntaxKind::Function),
118 "end" => Ok(JuliaSyntaxKind::End),
119 "begin" => Ok(JuliaSyntaxKind::Begin),
120 "module" => Ok(JuliaSyntaxKind::Module),
121 "using" => Ok(JuliaSyntaxKind::Using),
122 "import" => Ok(JuliaSyntaxKind::Import),
123 "export" => Ok(JuliaSyntaxKind::Export),
124 "const" => Ok(JuliaSyntaxKind::Const),
125 "local" => Ok(JuliaSyntaxKind::Local),
126 "global" => Ok(JuliaSyntaxKind::Global),
127 "true" => Ok(JuliaSyntaxKind::True),
128 "false" => Ok(JuliaSyntaxKind::False),
129 "nothing" => Ok(JuliaSyntaxKind::Nothing),
130 "return" => Ok(JuliaSyntaxKind::Return),
131 _ => Err(()),
132 }
133 }
134}
135
136impl JuliaSyntaxKind {
137 pub fn as_str(&self) -> &'static str {
138 match self {
139 JuliaSyntaxKind::Root => "root",
140 JuliaSyntaxKind::If => "if",
141 JuliaSyntaxKind::ElseIf => "elseif",
142 JuliaSyntaxKind::Else => "else",
143 JuliaSyntaxKind::For => "for",
144 JuliaSyntaxKind::While => "while",
145 JuliaSyntaxKind::Break => "break",
146 JuliaSyntaxKind::Continue => "continue",
147 JuliaSyntaxKind::Function => "function",
148 JuliaSyntaxKind::End => "end",
149 JuliaSyntaxKind::Begin => "begin",
150 JuliaSyntaxKind::Module => "module",
151 JuliaSyntaxKind::Using => "using",
152 JuliaSyntaxKind::Import => "import",
153 JuliaSyntaxKind::Export => "export",
154 JuliaSyntaxKind::Const => "const",
155 JuliaSyntaxKind::Local => "local",
156 JuliaSyntaxKind::Global => "global",
157 JuliaSyntaxKind::True => "true",
158 JuliaSyntaxKind::False => "false",
159 JuliaSyntaxKind::Nothing => "nothing",
160 JuliaSyntaxKind::Return => "return",
161 JuliaSyntaxKind::Plus => "+",
162 JuliaSyntaxKind::Minus => "-",
163 JuliaSyntaxKind::Star => "*",
164 JuliaSyntaxKind::Slash => "/",
165 JuliaSyntaxKind::Percent => "%",
166 JuliaSyntaxKind::Caret => "^",
167 JuliaSyntaxKind::Equal => "==",
168 JuliaSyntaxKind::NotEqual => "!=",
169 JuliaSyntaxKind::LessThan => "<",
170 JuliaSyntaxKind::GreaterThan => ">",
171 JuliaSyntaxKind::LessEqual => "<=",
172 JuliaSyntaxKind::GreaterEqual => ">=",
173 JuliaSyntaxKind::Assign => "=",
174 JuliaSyntaxKind::PlusAssign => "+=",
175 JuliaSyntaxKind::MinusAssign => "-=",
176 JuliaSyntaxKind::StarAssign => "*=",
177 JuliaSyntaxKind::SlashAssign => "/=",
178 JuliaSyntaxKind::PercentAssign => "%=",
179 JuliaSyntaxKind::CaretAssign => "^=",
180 JuliaSyntaxKind::And => "&&",
181 JuliaSyntaxKind::Or => "||",
182 JuliaSyntaxKind::Not => "!",
183 JuliaSyntaxKind::Colon => ":",
184 JuliaSyntaxKind::Dot => ".",
185 JuliaSyntaxKind::Range => "..",
186 JuliaSyntaxKind::Arrow => "->",
187 JuliaSyntaxKind::FatArrow => "=>",
188 JuliaSyntaxKind::BitAnd => "&",
189 JuliaSyntaxKind::BitOr => "|",
190 JuliaSyntaxKind::BitXor => "^",
191 JuliaSyntaxKind::BitNot => "~",
192 JuliaSyntaxKind::LeftShift => "<<",
193 JuliaSyntaxKind::RightShift => ">>",
194 JuliaSyntaxKind::LeftParen => "(",
195 JuliaSyntaxKind::RightParen => ")",
196 JuliaSyntaxKind::LeftBracket => "[",
197 JuliaSyntaxKind::RightBracket => "]",
198 JuliaSyntaxKind::LeftBrace => "{",
199 JuliaSyntaxKind::RightBrace => "}",
200 JuliaSyntaxKind::Comma => ",",
201 JuliaSyntaxKind::Semicolon => ";",
202 JuliaSyntaxKind::IntegerLiteral => "integer",
203 JuliaSyntaxKind::FloatLiteral => "float",
204 JuliaSyntaxKind::StringLiteral => "string",
205 JuliaSyntaxKind::CharLiteral => "char",
206 JuliaSyntaxKind::BooleanLiteral => "boolean",
207 JuliaSyntaxKind::NothingLiteral => "nothing",
208 JuliaSyntaxKind::Identifier => "identifier",
209 JuliaSyntaxKind::Comment => "comment",
210 JuliaSyntaxKind::Whitespace => "whitespace",
211 JuliaSyntaxKind::Newline => "newline",
212 JuliaSyntaxKind::Eof => "eof",
213 JuliaSyntaxKind::Error => "error",
214 JuliaSyntaxKind::Invalid => "invalid",
215 }
216 }
217
218 pub fn from_str(s: &str) -> Option<Self> {
219 match s {
220 "if" => Some(Self::If),
221 "elseif" => Some(Self::ElseIf),
222 "else" => Some(Self::Else),
223 "for" => Some(Self::For),
224 "while" => Some(Self::While),
225 "break" => Some(Self::Break),
226 "continue" => Some(Self::Continue),
227 "function" => Some(Self::Function),
228 "end" => Some(Self::End),
229 "begin" => Some(Self::Begin),
230 "module" => Some(Self::Module),
231 "using" => Some(Self::Using),
232 "import" => Some(Self::Import),
233 "export" => Some(Self::Export),
234 "const" => Some(Self::Const),
235 "local" => Some(Self::Local),
236 "global" => Some(Self::Global),
237 "true" => Some(Self::True),
238 "false" => Some(Self::False),
239 "nothing" => Some(Self::Nothing),
240 "return" => Some(Self::Return),
241 _ => None,
242 }
243 }
244}
245
246impl fmt::Display for JuliaSyntaxKind {
247 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
248 write!(f, "{}", self.as_str())
249 }
250}
251
252impl TokenType for JuliaSyntaxKind {
253 const END_OF_STREAM: Self = Self::Eof;
254 type Role = UniversalTokenRole;
255
256 fn role(&self) -> Self::Role {
257 match self {
258 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
259 Self::Comment => UniversalTokenRole::Comment,
260 Self::Eof => UniversalTokenRole::Eof,
261 _ => UniversalTokenRole::None,
262 }
263 }
264}
265
266impl ElementType for JuliaSyntaxKind {
267 type Role = UniversalElementRole;
268
269 fn role(&self) -> Self::Role {
270 match self {
271 Self::Root => UniversalElementRole::Root,
272 Self::Error => UniversalElementRole::Error,
273 _ => UniversalElementRole::None,
274 }
275 }
276}