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    Ident,
7    String,
8    Comment,
9    Whitespace,
10    Newline,
11    Indent,
12    Bang,
13    Percent,
14    Colon,
15    Question,
16    Amp,
17    Eq,
18    At,
19    LParen,
20    RParen,
21    LBracket,
22    RBracket,
23    ShellKw,
24    ShellFallbackKw,
25    Unknown,
26    Eof,
27    Document,
28    Directive,
29    DocComment,
30    NamespaceBlock,
31    TaskDecl,
32    Error,
33}
34
35impl SyntaxKind {
36    const MAX: u16 = SyntaxKind::Error as u16;
37}
38
39impl From<SyntaxKind> for RowanSyntaxKind {
40    fn from(value: SyntaxKind) -> Self {
41        RowanSyntaxKind(value as u16)
42    }
43}
44
45impl From<RowanSyntaxKind> for SyntaxKind {
46    fn from(raw: RowanSyntaxKind) -> Self {
47        if raw.0 <= Self::MAX {
48            // SAFETY: SyntaxKind is #[repr(u16)] and raw.0 is within the
49            // valid discriminant range [0, MAX].
50            unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
51        } else {
52            SyntaxKind::Unknown
53        }
54    }
55}