Skip to main content

sql_dialect_fmt_syntax/
macros.rs

1//! The `T!` shorthand macro: punctuation/operator token → [`crate::SyntaxKind`].
2//!
3//! `T![->>]` reads better than `SyntaxKind::FLOW_PIPE` in parser code (this is rust-analyzer's
4//! `T!` convention). Keyword kinds are referenced directly (e.g. `SyntaxKind::SELECT_KW`) for
5//! now; they can be folded into `T!` via codegen once the grammar stabilizes.
6//!
7//! Delimiters use the quoted-char trick (`T!['(']`) so the macro arguments stay balanced.
8
9/// Map a punctuation/operator token to its [`crate::SyntaxKind`].
10#[macro_export]
11macro_rules! T {
12    [,] => { $crate::SyntaxKind::COMMA };
13    [;] => { $crate::SyntaxKind::SEMICOLON };
14    ['('] => { $crate::SyntaxKind::L_PAREN };
15    [')'] => { $crate::SyntaxKind::R_PAREN };
16    ['['] => { $crate::SyntaxKind::L_BRACKET };
17    [']'] => { $crate::SyntaxKind::R_BRACKET };
18    ['{'] => { $crate::SyntaxKind::L_BRACE };
19    ['}'] => { $crate::SyntaxKind::R_BRACE };
20    [.] => { $crate::SyntaxKind::DOT };
21    [:] => { $crate::SyntaxKind::COLON };
22    [::] => { $crate::SyntaxKind::COLON2 };
23    [:=] => { $crate::SyntaxKind::ASSIGN };
24    [=] => { $crate::SyntaxKind::EQ };
25    [<>] => { $crate::SyntaxKind::NEQ };
26    [<] => { $crate::SyntaxKind::LT };
27    [<=] => { $crate::SyntaxKind::LTE };
28    [>] => { $crate::SyntaxKind::GT };
29    [>=] => { $crate::SyntaxKind::GTE };
30    [+] => { $crate::SyntaxKind::PLUS };
31    [-] => { $crate::SyntaxKind::MINUS };
32    [*] => { $crate::SyntaxKind::STAR };
33    [/] => { $crate::SyntaxKind::SLASH };
34    [%] => { $crate::SyntaxKind::PERCENT };
35    [||] => { $crate::SyntaxKind::CONCAT };
36    [|] => { $crate::SyntaxKind::PIPE };
37    [|>] => { $crate::SyntaxKind::PIPE_GT };
38    [->>] => { $crate::SyntaxKind::FLOW_PIPE };
39    [->] => { $crate::SyntaxKind::ARROW };
40    [=>] => { $crate::SyntaxKind::FAT_ARROW };
41    [&] => { $crate::SyntaxKind::AMP };
42    [^] => { $crate::SyntaxKind::CARET };
43    [~] => { $crate::SyntaxKind::TILDE };
44    [@] => { $crate::SyntaxKind::AT };
45    [?] => { $crate::SyntaxKind::QUESTION };
46}
47
48#[cfg(test)]
49mod tests {
50    // `T!` is already in scope crate-wide via `#[macro_use] mod macros;`.
51    use crate::SyntaxKind;
52
53    #[test]
54    fn t_macro_maps_punctuation() {
55        assert_eq!(T![,], SyntaxKind::COMMA);
56        assert_eq!(T![;], SyntaxKind::SEMICOLON);
57        assert_eq!(T!['('], SyntaxKind::L_PAREN);
58        assert_eq!(T![')'], SyntaxKind::R_PAREN);
59        assert_eq!(T!['['], SyntaxKind::L_BRACKET);
60        assert_eq!(T![']'], SyntaxKind::R_BRACKET);
61        assert_eq!(T!['{'], SyntaxKind::L_BRACE);
62        assert_eq!(T!['}'], SyntaxKind::R_BRACE);
63        assert_eq!(T![.], SyntaxKind::DOT);
64        assert_eq!(T![::], SyntaxKind::COLON2);
65        assert_eq!(T![:=], SyntaxKind::ASSIGN);
66        assert_eq!(T![<>], SyntaxKind::NEQ);
67        assert_eq!(T![<=], SyntaxKind::LTE);
68        assert_eq!(T![>=], SyntaxKind::GTE);
69        assert_eq!(T![|>], SyntaxKind::PIPE_GT);
70        assert_eq!(T![->>], SyntaxKind::FLOW_PIPE);
71        assert_eq!(T![||], SyntaxKind::CONCAT);
72        assert_eq!(T![|], SyntaxKind::PIPE);
73        assert_eq!(T![=>], SyntaxKind::FAT_ARROW);
74        assert_eq!(T![->], SyntaxKind::ARROW);
75        assert_eq!(T![@], SyntaxKind::AT);
76        assert_eq!(T![*], SyntaxKind::STAR);
77        assert_eq!(T![?], SyntaxKind::QUESTION);
78    }
79}