Skip to main content

only_syntax/
kind.rs

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            // SAFETY: SyntaxKind is #[repr(u16)] and raw.0 is within the
50            // valid discriminant range [0, MAX].
51            unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
52        } else {
53            SyntaxKind::Unknown
54        }
55    }
56}