Skip to main content

squawk_parser/
syntax_kind.rs

1// based on https://github.com/rust-lang/rust-analyzer/blob/d8887c0758bbd2d5f752d5bd405d4491e90e7ed6/crates/parser/src/syntax_kind.rs
2
3pub use crate::generated::syntax_kind::SyntaxKind;
4
5impl From<u16> for SyntaxKind {
6    #[inline]
7    fn from(d: u16) -> SyntaxKind {
8        assert!(d <= (SyntaxKind::__LAST as u16));
9        unsafe { std::mem::transmute::<u16, SyntaxKind>(d) }
10    }
11}
12
13impl From<SyntaxKind> for u16 {
14    #[inline]
15    fn from(k: SyntaxKind) -> u16 {
16        k as u16
17    }
18}
19
20impl SyntaxKind {
21    #[inline]
22    pub fn is_trivia(self) -> bool {
23        matches!(self, SyntaxKind::WHITESPACE | SyntaxKind::COMMENT)
24    }
25}
26
27#[inline]
28pub fn is_reserved_keyword(kind: SyntaxKind) -> bool {
29    kind <= SyntaxKind::WHITESPACE && crate::generated::token_sets::RESERVED_KEYWORDS.contains(kind)
30}
31
32#[inline]
33pub fn is_col_name_keyword(kind: SyntaxKind) -> bool {
34    kind <= SyntaxKind::WHITESPACE
35        && crate::generated::token_sets::COL_NAME_KEYWORD_FIRST.contains(kind)
36}
37
38#[inline]
39pub fn is_type_func_name_keyword(kind: SyntaxKind) -> bool {
40    kind <= SyntaxKind::WHITESPACE
41        && crate::generated::token_sets::TYPE_FUNC_NAME_KEYWORDS.contains(kind)
42}
43
44#[cfg(test)]
45mod tests {
46    use super::{SyntaxKind, is_col_name_keyword, is_reserved_keyword, is_type_func_name_keyword};
47
48    #[test]
49    fn keyword_categories() {
50        assert!(is_reserved_keyword(SyntaxKind::SELECT_KW));
51        assert!(is_col_name_keyword(SyntaxKind::BETWEEN_KW));
52        assert!(is_type_func_name_keyword(SyntaxKind::LEFT_KW));
53
54        assert!(!is_reserved_keyword(SyntaxKind::IDENT));
55        assert!(!is_reserved_keyword(SyntaxKind::SELECT));
56    }
57}