Skip to content

Commit 611d680

Browse files
committed
feat: Give joins their own token kind
1 parent bc41595 commit 611d680

File tree

2 files changed

+42
-16
lines changed

2 files changed

+42
-16
lines changed

src/formatter.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ pub(crate) fn format(
101101
formatter.format_newline_reserved_word(token, &mut formatted_query);
102102
formatter.previous_reserved_word = Some(token);
103103
}
104+
TokenKind::Join => {
105+
formatter.format_newline_reserved_word(token, &mut formatted_query);
106+
formatter.previous_reserved_word = Some(token);
107+
}
104108
TokenKind::Reserved => {
105109
formatter.format_with_spaces(token, &mut formatted_query);
106110
formatter.previous_reserved_word = Some(token);
@@ -210,8 +214,9 @@ impl<'a> Formatter<'a> {
210214
self.add_new_line(query);
211215
self.indentation.increase_top_level(span_len);
212216
query.push_str(&self.equalize_whitespace(&self.format_reserved_word(token.value)));
213-
if !(!["select", "from"].contains(&token.value.to_lowercase().as_str())
214-
&& self.options.inline_first_top_level)
217+
let new_line = ["select", "from"].contains(&token.value.to_lowercase().as_str())
218+
|| !self.options.inline_first_top_level;
219+
if new_line
215220
&& self
216221
.options
217222
.max_inline_top_level

src/tokenizer.rs

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ pub(crate) enum TokenKind {
6969
Number,
7070
Placeholder,
7171
Word,
72+
Join,
7273
}
7374

7475
#[derive(Debug, Clone)]
@@ -379,6 +380,7 @@ fn get_reserved_word_token<'a>(
379380
alt((
380381
get_top_level_reserved_token(last_reserved_top_level_token),
381382
get_newline_reserved_token(last_reserved_token),
383+
get_join_token(),
382384
get_top_level_reserved_token_no_indent,
383385
get_plain_reserved_token,
384386
))
@@ -497,16 +499,11 @@ fn get_top_level_reserved_token<'a>(
497499
}
498500
}
499501

500-
fn get_newline_reserved_token<'a>(
501-
last_reserved_token: Option<Token<'a>>,
502-
) -> impl Parser<&'a str, Token<'a>, ContextError> {
502+
fn get_join_token<'a>() -> impl Parser<&'a str, Token<'a>, ContextError> {
503503
move |input: &mut &'a str| {
504504
let uc_input: String = get_uc_words(input, 3);
505505
let mut uc_input = uc_input.as_str();
506506

507-
// We have to break up the alternatives into multiple subsets
508-
// to avoid exceeding the alt() 21 element limit.
509-
510507
// Standard SQL joins
511508
let standard_joins = alt((
512509
terminated("JOIN", end_of_word),
@@ -544,6 +541,37 @@ fn get_newline_reserved_token<'a>(
544541
terminated("GLOBAL FULL JOIN", end_of_word),
545542
));
546543

544+
// Combine all parsers
545+
let result: PResult<&str> =
546+
alt((standard_joins, specific_joins, special_joins)).parse_next(&mut uc_input);
547+
548+
if let Ok(token) = result {
549+
let final_word = token.split(' ').last().unwrap();
550+
let input_end_pos =
551+
input.to_ascii_uppercase().find(final_word).unwrap() + final_word.len();
552+
let token = input.next_slice(input_end_pos);
553+
let kind = TokenKind::Join;
554+
Ok(Token {
555+
kind,
556+
value: token,
557+
key: None,
558+
})
559+
} else {
560+
Err(ErrMode::from_error_kind(input, ErrorKind::Alt))
561+
}
562+
}
563+
}
564+
565+
fn get_newline_reserved_token<'a>(
566+
last_reserved_token: Option<Token<'a>>,
567+
) -> impl Parser<&'a str, Token<'a>, ContextError> {
568+
move |input: &mut &'a str| {
569+
let uc_input: String = get_uc_words(input, 3);
570+
let mut uc_input = uc_input.as_str();
571+
572+
// We have to break up the alternatives into multiple subsets
573+
// to avoid exceeding the alt() 21 element limit.
574+
547575
// Legacy and logical operators
548576
let operators = alt((
549577
terminated("CROSS APPLY", end_of_word),
@@ -565,14 +593,7 @@ fn get_newline_reserved_token<'a>(
565593
));
566594

567595
// Combine all parsers
568-
let result: PResult<&str> = alt((
569-
standard_joins,
570-
specific_joins,
571-
special_joins,
572-
operators,
573-
alter_table_actions,
574-
))
575-
.parse_next(&mut uc_input);
596+
let result: PResult<&str> = alt((operators, alter_table_actions)).parse_next(&mut uc_input);
576597

577598
if let Ok(token) = result {
578599
let final_word = token.split(' ').last().unwrap();

0 commit comments

Comments
 (0)