bytebraise_syntax/syntax/
syntax_kind.rs

1use bytebraise_lexer::token::TokenKind;
2
3pub fn syntax_kind_for_token_kind(token_kind: TokenKind) -> SyntaxKind {
4    match token_kind {
5        TokenKind::Error(_) => unimplemented!("TODO return error too"),
6        TokenKind::AddHandler => SyntaxKind::AddHandler,
7        TokenKind::AddTask => SyntaxKind::AddTask,
8        TokenKind::After => SyntaxKind::After,
9        TokenKind::Before => SyntaxKind::Before,
10        TokenKind::CloseParenthesis => SyntaxKind::CloseParenthesis,
11        TokenKind::Colon => SyntaxKind::Colon,
12        TokenKind::ColonEquals => SyntaxKind::ColonEquals,
13        TokenKind::Comment => SyntaxKind::Comment,
14        TokenKind::DefaultEquals => SyntaxKind::DefaultEquals,
15        TokenKind::DelTask => SyntaxKind::DelTask,
16        TokenKind::DotEquals => SyntaxKind::DotEquals,
17        TokenKind::DoubleQuote => SyntaxKind::DoubleQuote,
18        TokenKind::DoubleQuotedValue => SyntaxKind::DoubleQuotedValue,
19        TokenKind::EndOfInput => SyntaxKind::EndOfInput,
20        TokenKind::Equals => SyntaxKind::Equals,
21        TokenKind::EqualsDot => SyntaxKind::EqualsDot,
22        TokenKind::EqualsPlus => SyntaxKind::EqualsPlus,
23        TokenKind::EscapedNewline => SyntaxKind::EscapedNewline,
24        TokenKind::Export => SyntaxKind::Export,
25        TokenKind::ExportFunctions => SyntaxKind::ExportFunctions,
26        TokenKind::Fakeroot => SyntaxKind::Fakeroot,
27        TokenKind::Identifier => SyntaxKind::Identifier,
28        TokenKind::DirectiveArgument => SyntaxKind::DirectiveArgument,
29        TokenKind::Include => SyntaxKind::Include,
30        TokenKind::Inherit => SyntaxKind::Inherit,
31        TokenKind::Newline => SyntaxKind::Newline,
32        TokenKind::OpenParenthesis => SyntaxKind::OpenParenthesis,
33        TokenKind::PlusEquals => SyntaxKind::PlusEquals,
34        TokenKind::Python => SyntaxKind::Python,
35        TokenKind::PythonDefKeyword => SyntaxKind::PythonDefKeyword,
36        TokenKind::PythonDefFunctionName => SyntaxKind::PythonDefFunctionName,
37        TokenKind::PythonDefFunctionArgs => SyntaxKind::PythonDefFunctionArgs,
38        TokenKind::PythonDefFunctionBody => SyntaxKind::PythonDefFunctionBody,
39        TokenKind::Require => SyntaxKind::Require,
40        TokenKind::SingleQuote => SyntaxKind::SingleQuote,
41        TokenKind::SingleQuotedValue => SyntaxKind::SingleQuotedValue,
42        TokenKind::SquareCloseBracket => SyntaxKind::SquareCloseBracket,
43        TokenKind::SquareOpenBracket => SyntaxKind::SquareOpenBracket,
44        TokenKind::Task => SyntaxKind::Task,
45        TokenKind::UnquotedValue => SyntaxKind::UnquotedValue,
46        TokenKind::Unset => SyntaxKind::Unset,
47        TokenKind::Varflag => SyntaxKind::Varflag,
48        TokenKind::WeakEquals => SyntaxKind::WeakEquals,
49        TokenKind::Whitespace => SyntaxKind::Whitespace,
50    }
51}
52
53#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
54#[repr(u16)]
55pub enum SyntaxKind {
56    Error = 0,
57
58    // Tokens
59    AddHandler,
60    AddTask,
61    After,
62    Before,
63    CloseParenthesis,
64    Colon,
65    ColonEquals,
66    Comment,
67    DefaultEquals,
68    DelTask,
69    DotEquals,
70    DoubleQuote,
71    DoubleQuotedValue,
72    EndOfInput,
73    Equals,
74    EqualsDot,
75    EqualsPlus,
76    EscapedNewline,
77    Export,
78    ExportFunctions,
79    Fakeroot,
80    Identifier,
81    DirectiveArgument,
82    Include,
83    Inherit,
84    Newline,
85    OpenParenthesis,
86    PlusEquals,
87    Python,
88    PythonDefKeyword,
89    PythonDefFunctionName,
90    PythonDefFunctionArgs,
91    PythonDefFunctionBody,
92    Require,
93    SingleQuote,
94    SingleQuotedValue,
95    SquareCloseBracket,
96    SquareOpenBracket,
97    Task,
98    UnquotedValue,
99    Unset,
100    Varflag,
101    WeakEquals,
102    Whitespace = 0x200, // << last token
103
104    // Compound nodes representing top-level metadata items
105    AssignmentNode,
106    ExportNode,
107    IncludeNode,
108    RequireNode,
109    TaskNode,
110    UnsetNode,
111    ExportFunctionsNode,
112    InheritNode,
113    PythonDefNode,
114    AddTaskNode,
115    DelTaskNode,
116    AddHandlerNode,
117
118    // Helper compound nodes that do not appear at the root of the AST
119    IdentifierExpressionNode,
120
121    // Compound top-level node (i.e. the metadata or config file)
122    // Must be the last entry in the enum
123    RootNode,
124}
125
126impl SyntaxKind {
127    pub fn is_token(&self) -> bool {
128        (*self as u16) <= (SyntaxKind::Whitespace as u16)
129    }
130
131    pub fn is_node(&self) -> bool {
132        !self.is_token()
133    }
134
135    pub fn is_whitespace(&self) -> bool {
136        matches!(self, SyntaxKind::Whitespace | SyntaxKind::Newline)
137    }
138
139    pub fn is_end_of_input(&self) -> bool {
140        matches!(self, SyntaxKind::EndOfInput)
141    }
142
143    pub fn is_assignment_operator(&self) -> bool {
144        matches!(
145            self,
146            SyntaxKind::Equals
147                | SyntaxKind::EqualsPlus
148                | SyntaxKind::EqualsDot
149                | SyntaxKind::WeakEquals
150                | SyntaxKind::DefaultEquals
151                | SyntaxKind::DotEquals
152                | SyntaxKind::PlusEquals
153                | SyntaxKind::ColonEquals
154        )
155    }
156}