1use rowan::SyntaxKind as RowanSyntaxKind;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
4#[repr(u16)]
5pub enum SyntaxKind {
6 Bom,
7 Ident,
8 String,
9 Comment,
10 Whitespace,
11 Newline,
12 Indent,
13 Bang,
14 Percent,
15 Colon,
16 Question,
17 Amp,
18 Eq,
19 At,
20 LParen,
21 RParen,
22 LBracket,
23 RBracket,
24 ShellKw,
25 ShellFallbackKw,
26 Unknown,
27 Eof,
28 Document,
29 Directive,
30 DocComment,
31 NamespaceBlock,
32 TaskDecl,
33 Error,
34}
35
36impl SyntaxKind {
37 const MAX: u16 = SyntaxKind::Error as u16;
38}
39
40impl From<SyntaxKind> for RowanSyntaxKind {
41 fn from(value: SyntaxKind) -> Self {
42 RowanSyntaxKind(value as u16)
43 }
44}
45
46impl From<RowanSyntaxKind> for SyntaxKind {
47 fn from(raw: RowanSyntaxKind) -> Self {
48 if raw.0 <= Self::MAX {
49 unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
52 } else {
53 SyntaxKind::Unknown
54 }
55 }
56}