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    LBrace,
25    RBrace,
26    ShellKw,
27    ShellFallbackKw,
28    Unknown,
29    Eof,
30    Document,
31    Directive,
32    DocComment,
33    NamespaceBlock,
34    TaskDecl,
35    TaskHeader,
36    TaskName,
37    ParameterList,
38    Parameter,
39    GuardClause,
40    DependencyClause,
41    ShellClause,
42    HeaderTerminator,
43    Error,
44}
45
46impl SyntaxKind {
47    const MAX: u16 = SyntaxKind::Error as u16;
48}
49
50impl From<SyntaxKind> for RowanSyntaxKind {
51    fn from(value: SyntaxKind) -> Self {
52        RowanSyntaxKind(value as u16)
53    }
54}
55
56impl From<RowanSyntaxKind> for SyntaxKind {
57    fn from(raw: RowanSyntaxKind) -> Self {
58        if raw.0 <= Self::MAX {
59            // SAFETY: SyntaxKind is #[repr(u16)] and raw.0 is within the
60            // valid discriminant range [0, MAX].
61            unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
62        } else {
63            SyntaxKind::Unknown
64        }
65    }
66}