1use derive_more::Display;
2use num_derive::{FromPrimitive, ToPrimitive};
3
4#[derive(
5 Debug, Display, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, ToPrimitive, FromPrimitive,
6)]
7pub enum SyntaxKind {
8 #[display("whitespace")]
10 Whitespace,
11
12 #[display("line comment")]
13 LineComment,
14
15 #[display("block comment")]
16 BlockComment,
17
18 #[display("string literal")]
20 String,
21
22 #[display("hex literal")]
23 Hex,
24
25 #[display("integer literal")]
26 Integer,
27
28 #[display("identifier")]
29 Ident,
30
31 #[display("`nil`")]
33 Nil,
34
35 #[display("`true`")]
36 True,
37
38 #[display("`false`")]
39 False,
40
41 #[display("`export`")]
42 Export,
43
44 #[display("`inline`")]
45 Inline,
46
47 #[display("`mod`")]
48 Mod,
49
50 #[display("`fn`")]
51 Fn,
52
53 #[display("`const`")]
54 Const,
55
56 #[display("`type`")]
57 Type,
58
59 #[display("`struct`")]
60 Struct,
61
62 #[display("`let`")]
63 Let,
64
65 #[display("`if`")]
66 If,
67
68 #[display("`else`")]
69 Else,
70
71 #[display("`return`")]
72 Return,
73
74 #[display("`assert`")]
75 Assert,
76
77 #[display("`raise`")]
78 Raise,
79
80 #[display("`is`")]
81 Is,
82
83 #[display("`as`")]
84 As,
85
86 #[display("`(`")]
88 OpenParen,
89
90 #[display("`)`")]
91 CloseParen,
92
93 #[display("`{{`")]
94 OpenBrace,
95
96 #[display("`}}`")]
97 CloseBrace,
98
99 #[display("`[`")]
100 OpenBracket,
101
102 #[display("`]`")]
103 CloseBracket,
104
105 #[display("`+`")]
107 Plus,
108
109 #[display("`-`")]
110 Minus,
111
112 #[display("`*`")]
113 Star,
114
115 #[display("`/`")]
116 Slash,
117
118 #[display("`%`")]
119 Percent,
120
121 #[display("`==`")]
123 Equals,
124
125 #[display("`!=`")]
126 NotEquals,
127
128 #[display("`<`")]
129 LessThan,
130
131 #[display("`>`")]
132 GreaterThan,
133
134 #[display("`<=`")]
135 LessThanEquals,
136
137 #[display("`>=`")]
138 GreaterThanEquals,
139
140 #[display("`!`")]
142 Not,
143
144 #[display("`&&`")]
145 And,
146
147 #[display("`||`")]
148 Or,
149
150 #[display("`~`")]
152 BitwiseNot,
153
154 #[display("`&`")]
155 BitwiseAnd,
156
157 #[display("`|`")]
158 BitwiseOr,
159
160 #[display("`^`")]
161 BitwiseXor,
162
163 #[display("`<<`")]
164 LeftShift,
165
166 #[display("`>>`")]
167 RightShift,
168
169 #[display("`=`")]
171 Assign,
172
173 #[display("`.`")]
174 Dot,
175
176 #[display("`,`")]
177 Comma,
178
179 #[display("`:`")]
180 Colon,
181
182 #[display("`;`")]
183 Semicolon,
184
185 #[display("`->`")]
186 Arrow,
187
188 #[display("`=>`")]
189 FatArrow,
190
191 #[display("`::`")]
192 PathSeparator,
193
194 #[display("`...`")]
195 Spread,
196
197 #[display("document")]
199 Document,
200
201 #[display("module item")]
202 ModuleItem,
203
204 #[display("function item")]
205 FunctionItem,
206
207 #[display("function parameter")]
208 FunctionParameter,
209
210 #[display("constant item")]
211 ConstantItem,
212
213 #[display("type alias item")]
214 TypeAliasItem,
215
216 #[display("struct item")]
217 StructItem,
218
219 #[display("struct field")]
220 StructField,
221
222 #[display("generic parameters")]
223 GenericParameters,
224
225 #[display("generic arguments")]
226 GenericArguments,
227
228 #[display("literal type")]
229 LiteralType,
230
231 #[display("path type")]
232 PathType,
233
234 #[display("union type")]
235 UnionType,
236
237 #[display("group type")]
238 GroupType,
239
240 #[display("pair type")]
241 PairType,
242
243 #[display("lambda type")]
244 LambdaType,
245
246 #[display("lambda parameter")]
247 LambdaParameter,
248
249 #[display("block")]
250 Block,
251
252 #[display("let statement")]
253 LetStmt,
254
255 #[display("expression statement")]
256 ExprStmt,
257
258 #[display("if statement")]
259 IfStmt,
260
261 #[display("return statement")]
262 ReturnStmt,
263
264 #[display("assert statement")]
265 AssertStmt,
266
267 #[display("raise statement")]
268 RaiseStmt,
269
270 #[display("path expression")]
271 PathExpr,
272
273 #[display("path segment")]
274 PathSegment,
275
276 #[display("leading path separator")]
277 LeadingPathSeparator,
278
279 #[display("struct initializer expression")]
280 StructInitializerExpr,
281
282 #[display("struct initializer field")]
283 StructInitializerField,
284
285 #[display("literal expression")]
286 LiteralExpr,
287
288 #[display("group expression")]
289 GroupExpr,
290
291 #[display("pair expression")]
292 PairExpr,
293
294 #[display("list expression")]
295 ListExpr,
296
297 #[display("list item")]
298 ListItem,
299
300 #[display("prefix expression")]
301 PrefixExpr,
302
303 #[display("binary expression")]
304 BinaryExpr,
305
306 #[display("function call expression")]
307 FunctionCallExpr,
308
309 #[display("if expression")]
310 IfExpr,
311
312 #[display("guard expression")]
313 GuardExpr,
314
315 #[display("cast expression")]
316 CastExpr,
317
318 #[display("field access expression")]
319 FieldAccessExpr,
320
321 #[display("lambda expression")]
322 LambdaExpr,
323
324 #[display("error")]
326 Error,
327
328 #[display("eof")]
329 Eof,
330}
331
332#[macro_export]
333macro_rules! T {
334 [nil] => { $crate::SyntaxKind::Nil };
335 [true] => { $crate::SyntaxKind::True };
336 [false] => { $crate::SyntaxKind::False };
337 [export] => { $crate::SyntaxKind::Export };
338 [inline] => { $crate::SyntaxKind::Inline };
339 [mod] => { $crate::SyntaxKind::Mod };
340 [fn] => { $crate::SyntaxKind::Fn };
341 [const] => { $crate::SyntaxKind::Const };
342 [type] => { $crate::SyntaxKind::Type };
343 [struct] => { $crate::SyntaxKind::Struct };
344 [let] => { $crate::SyntaxKind::Let };
345 [if] => { $crate::SyntaxKind::If };
346 [else] => { $crate::SyntaxKind::Else };
347 [return] => { $crate::SyntaxKind::Return };
348 [assert] => { $crate::SyntaxKind::Assert };
349 [raise] => { $crate::SyntaxKind::Raise };
350 [is] => { $crate::SyntaxKind::Is };
351 [as] => { $crate::SyntaxKind::As };
352 ['('] => { $crate::SyntaxKind::OpenParen };
353 [')'] => { $crate::SyntaxKind::CloseParen };
354 ['{'] => { $crate::SyntaxKind::OpenBrace };
355 ['}'] => { $crate::SyntaxKind::CloseBrace };
356 ['['] => { $crate::SyntaxKind::OpenBracket };
357 [']'] => { $crate::SyntaxKind::CloseBracket };
358 [+] => { $crate::SyntaxKind::Plus };
359 [-] => { $crate::SyntaxKind::Minus };
360 [*] => { $crate::SyntaxKind::Star };
361 [/] => { $crate::SyntaxKind::Slash };
362 [%] => { $crate::SyntaxKind::Percent };
363 [==] => { $crate::SyntaxKind::Equals };
364 [!=] => { $crate::SyntaxKind::NotEquals };
365 [<] => { $crate::SyntaxKind::LessThan };
366 [>] => { $crate::SyntaxKind::GreaterThan };
367 [<=] => { $crate::SyntaxKind::LessThanEquals };
368 [>=] => { $crate::SyntaxKind::GreaterThanEquals };
369 [!] => { $crate::SyntaxKind::Not };
370 [&&] => { $crate::SyntaxKind::And };
371 [||] => { $crate::SyntaxKind::Or };
372 [&] => { $crate::SyntaxKind::BitwiseAnd };
373 [|] => { $crate::SyntaxKind::BitwiseOr };
374 [~] => { $crate::SyntaxKind::BitwiseNot };
375 [^] => { $crate::SyntaxKind::BitwiseXor };
376 [<<] => { $crate::SyntaxKind::LeftShift };
377 [>>] => { $crate::SyntaxKind::RightShift };
378 [=] => { $crate::SyntaxKind::Assign };
379 [.] => { $crate::SyntaxKind::Dot };
380 [,] => { $crate::SyntaxKind::Comma };
381 [:] => { $crate::SyntaxKind::Colon };
382 [;] => { $crate::SyntaxKind::Semicolon };
383 [->] => { $crate::SyntaxKind::Arrow };
384 [=>] => { $crate::SyntaxKind::FatArrow };
385 [::] => { $crate::SyntaxKind::PathSeparator };
386 [...] => { $crate::SyntaxKind::Spread };
387}
388
389impl SyntaxKind {
390 pub const LITERAL: &[Self] = &[
391 SyntaxKind::String,
392 SyntaxKind::Hex,
393 SyntaxKind::Integer,
394 T![nil],
395 T![true],
396 T![false],
397 ];
398 pub const PREFIX_OPS: &[Self] = &[T![!], T![-], T![+], T![~]];
399 pub const BINARY_OPS: &[Self] = &[
400 T![+],
401 T![-],
402 T![*],
403 T![/],
404 T![%],
405 T![<],
406 T![>],
407 T![<=],
408 T![>=],
409 T![==],
410 T![!=],
411 T![&&],
412 T![||],
413 T![&],
414 T![|],
415 T![^],
416 T![<<],
417 T![>>],
418 ];
419
420 pub fn is_trivia(&self) -> bool {
421 matches!(
422 self,
423 Self::Whitespace | Self::LineComment | Self::BlockComment | Self::Error
424 )
425 }
426
427 pub fn split(&self) -> &'static [Self] {
428 match self {
429 SyntaxKind::Whitespace => &[Self::Whitespace],
430 SyntaxKind::LineComment => &[Self::LineComment],
431 SyntaxKind::BlockComment => &[Self::BlockComment],
432 SyntaxKind::String => &[Self::String],
433 SyntaxKind::Hex => &[Self::Hex],
434 SyntaxKind::Integer => &[Self::Integer],
435 SyntaxKind::Ident => &[Self::Ident],
436 T![nil] => &[T![nil]],
437 T![true] => &[T![true]],
438 T![false] => &[T![false]],
439 T![export] => &[T![export]],
440 T![inline] => &[T![inline]],
441 T![mod] => &[T![mod]],
442 T![fn] => &[T![fn]],
443 T![const] => &[T![const]],
444 T![type] => &[T![type]],
445 T![struct] => &[T![struct]],
446 T![let] => &[T![let]],
447 T![if] => &[T![if]],
448 T![else] => &[T![else]],
449 T![return] => &[T![return]],
450 T![assert] => &[T![assert]],
451 T![raise] => &[T![raise]],
452 T![is] => &[T![is]],
453 T![as] => &[T![as]],
454 T!['('] => &[T!['(']],
455 T![')'] => &[T![')']],
456 T!['{'] => &[T!['{']],
457 T!['}'] => &[T!['}']],
458 T!['['] => &[T!['[']],
459 T![']'] => &[T![']']],
460 T![+] => &[T![+]],
461 T![-] => &[T![-]],
462 T![*] => &[T![*]],
463 T![/] => &[T![/]],
464 T![%] => &[T![%]],
465 T![==] => &[T![=], T![=]],
466 T![!=] => &[T![!], T![=]],
467 T![<] => &[T![<]],
468 T![>] => &[T![>]],
469 T![<=] => &[T![<], T![=]],
470 T![>=] => &[T![>], T![=]],
471 T![!] => &[T![!]],
472 T![&&] => &[T![&], T![&]],
473 T![||] => &[T![|], T![|]],
474 T![~] => &[T![~]],
475 T![&] => &[T![&]],
476 T![|] => &[T![|]],
477 T![^] => &[T![^]],
478 T![<<] => &[T![<], T![<]],
479 T![>>] => &[T![>], T![>]],
480 T![=] => &[T![=]],
481 T![.] => &[T![.]],
482 T![,] => &[T![,]],
483 T![:] => &[T![:]],
484 T![;] => &[T![;]],
485 T![->] => &[T![-], T![>]],
486 T![=>] => &[T![=], T![>]],
487 T![::] => &[T![:], T![:]],
488 T![...] => &[T![.], T![.], T![.]],
489 SyntaxKind::Document => &[SyntaxKind::Document],
490 SyntaxKind::ModuleItem => &[SyntaxKind::ModuleItem],
491 SyntaxKind::FunctionItem => &[SyntaxKind::FunctionItem],
492 SyntaxKind::FunctionParameter => &[SyntaxKind::FunctionParameter],
493 SyntaxKind::ConstantItem => &[SyntaxKind::ConstantItem],
494 SyntaxKind::TypeAliasItem => &[SyntaxKind::TypeAliasItem],
495 SyntaxKind::StructItem => &[SyntaxKind::StructItem],
496 SyntaxKind::StructField => &[SyntaxKind::StructField],
497 SyntaxKind::GenericParameters => &[SyntaxKind::GenericParameters],
498 SyntaxKind::GenericArguments => &[SyntaxKind::GenericArguments],
499 SyntaxKind::LiteralType => &[SyntaxKind::LiteralType],
500 SyntaxKind::PathType => &[SyntaxKind::PathType],
501 SyntaxKind::UnionType => &[SyntaxKind::UnionType],
502 SyntaxKind::GroupType => &[SyntaxKind::GroupType],
503 SyntaxKind::PairType => &[SyntaxKind::PairType],
504 SyntaxKind::LambdaType => &[SyntaxKind::LambdaType],
505 SyntaxKind::LambdaParameter => &[SyntaxKind::LambdaParameter],
506 SyntaxKind::Block => &[SyntaxKind::Block],
507 SyntaxKind::LetStmt => &[SyntaxKind::LetStmt],
508 SyntaxKind::ExprStmt => &[SyntaxKind::ExprStmt],
509 SyntaxKind::IfStmt => &[SyntaxKind::IfStmt],
510 SyntaxKind::ReturnStmt => &[SyntaxKind::ReturnStmt],
511 SyntaxKind::AssertStmt => &[SyntaxKind::AssertStmt],
512 SyntaxKind::RaiseStmt => &[SyntaxKind::RaiseStmt],
513 SyntaxKind::PathExpr => &[SyntaxKind::PathExpr],
514 SyntaxKind::PathSegment => &[SyntaxKind::PathSegment],
515 SyntaxKind::LeadingPathSeparator => &[SyntaxKind::LeadingPathSeparator],
516 SyntaxKind::StructInitializerExpr => &[SyntaxKind::StructInitializerExpr],
517 SyntaxKind::StructInitializerField => &[SyntaxKind::StructInitializerField],
518 SyntaxKind::LiteralExpr => &[SyntaxKind::LiteralExpr],
519 SyntaxKind::GroupExpr => &[SyntaxKind::GroupExpr],
520 SyntaxKind::PairExpr => &[SyntaxKind::PairExpr],
521 SyntaxKind::ListExpr => &[SyntaxKind::ListExpr],
522 SyntaxKind::ListItem => &[SyntaxKind::ListItem],
523 SyntaxKind::PrefixExpr => &[SyntaxKind::PrefixExpr],
524 SyntaxKind::BinaryExpr => &[SyntaxKind::BinaryExpr],
525 SyntaxKind::FunctionCallExpr => &[SyntaxKind::FunctionCallExpr],
526 SyntaxKind::IfExpr => &[SyntaxKind::IfExpr],
527 SyntaxKind::GuardExpr => &[SyntaxKind::GuardExpr],
528 SyntaxKind::CastExpr => &[SyntaxKind::CastExpr],
529 SyntaxKind::FieldAccessExpr => &[SyntaxKind::FieldAccessExpr],
530 SyntaxKind::LambdaExpr => &[SyntaxKind::LambdaExpr],
531 SyntaxKind::Error => &[SyntaxKind::Error],
532 SyntaxKind::Eof => &[SyntaxKind::Eof],
533 }
534 }
535}