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    GroupKw,
14    Bang,
15    Colon,
16    Question,
17    Amp,
18    Eq,
19    At,
20    LParen,
21    RParen,
22    LBracket,
23    RBracket,
24    LBrace,
25    RBrace,
26    Comma,
27    ShellKw,
28    ShellFallbackKw,
29    Unknown,
30    Eof,
31    Document,
32    Directive,
33    MetadataComment,
34    NamespaceBlock,
35    TaskDecl,
36    TaskHeader,
37    TaskName,
38    ParameterList,
39    Parameter,
40    ConditionClause,
41    DependencyClause,
42    ShellClause,
43    HeaderTerminator,
44    Error,
45}
46
47impl SyntaxKind {
48    const MAX: u16 = SyntaxKind::Error as u16;
49}
50
51impl From<SyntaxKind> for RowanSyntaxKind {
52    fn from(value: SyntaxKind) -> Self {
53        RowanSyntaxKind(value as u16)
54    }
55}
56
57impl From<RowanSyntaxKind> for SyntaxKind {
58    fn from(raw: RowanSyntaxKind) -> Self {
59        if raw.0 <= Self::MAX {
60            // SAFETY: SyntaxKind is #[repr(u16)] and raw.0 is within the
61            // valid discriminant range [0, MAX].
62            unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
63        } else {
64            SyntaxKind::Unknown
65        }
66    }
67}