use sql_dialect_fmt_syntax::SyntaxKind;
use SyntaxKind::*;
pub(super) fn needs_space(prev: SyntaxKind, cur: SyntaxKind) -> bool {
if matches!(prev, INT_NUMBER | FLOAT_NUMBER) && cur == DOT {
return true;
}
if prev == DOT && matches!(cur, INT_NUMBER | FLOAT_NUMBER) {
return true;
}
if matches!(
cur,
COMMA | SEMICOLON | R_PAREN | R_BRACKET | R_BRACE | DOT | COLON | COLON2
) {
return false;
}
if matches!(
prev,
DOT | COLON | COLON2 | L_PAREN | L_BRACKET | L_BRACE | AT
) {
return false;
}
if cur == L_PAREN
&& matches!(
prev,
IDENT
| QUOTED_IDENT
| R_PAREN
| R_BRACKET
| CAST_KW
| TRY_CAST_KW
| FLATTEN_KW
| TABLE_KW
)
{
return false;
}
if cur == L_BRACKET && is_value_end(prev) {
return false;
}
true
}
pub(super) fn must_separate_to_preserve_tokens(prev: SyntaxKind, cur: SyntaxKind) -> bool {
matches!(
(prev, cur),
(MINUS, GT)
| (MINUS, MINUS)
| (MINUS, ARROW)
| (MINUS, FLOW_PIPE)
| (EQ, GT)
| (LT, EQ)
| (LT, GT)
| (GT, EQ)
| (COLON, EQ)
| (COLON, COLON)
| (COLON, ASSIGN)
| (COLON, COLON2)
| (COLON, FAT_ARROW)
| (PIPE, GT)
| (PIPE, PIPE)
| (BANG, EQ)
| (SLASH, SLASH)
| (SLASH, STAR)
)
}
pub(super) fn is_value_end(kind: SyntaxKind) -> bool {
matches!(
kind,
IDENT
| QUOTED_IDENT
| STRING
| INT_NUMBER
| FLOAT_NUMBER
| VARIABLE
| QUESTION
| R_PAREN
| R_BRACKET
| R_BRACE
| NULL_KW
| TRUE_KW
| FALSE_KW
| END_KW
)
}