@@ -148,7 +148,8 @@ struct Formatter<'a> {
148
148
options : & ' a FormatOptions < ' a > ,
149
149
indentation : Indentation < ' a > ,
150
150
inline_block : InlineBlock ,
151
- line_start : usize ,
151
+ span_len : usize ,
152
+ block_level : usize ,
152
153
}
153
154
154
155
impl < ' a > Formatter < ' a > {
@@ -165,7 +166,8 @@ impl<'a> Formatter<'a> {
165
166
options. max_inline_block ,
166
167
options. max_inline_arguments . is_none ( ) ,
167
168
) ,
168
- line_start : 0 ,
169
+ span_len : 0 ,
170
+ block_level : 0 ,
169
171
}
170
172
}
171
173
@@ -209,11 +211,11 @@ impl<'a> Formatter<'a> {
209
211
self . add_new_line ( query) ;
210
212
self . indentation . increase_top_level ( ) ;
211
213
query. push_str ( & self . equalize_whitespace ( & self . format_reserved_word ( token. value ) ) ) ;
212
- let len = self . top_level_tokens_span ( ) ;
214
+ self . span_len = self . top_level_tokens_span ( ) ;
213
215
if self
214
216
. options
215
217
. max_inline_top_level
216
- . map_or ( true , |limit| limit < len )
218
+ . map_or ( true , |limit| limit < self . span_len )
217
219
{
218
220
self . add_new_line ( query) ;
219
221
} else {
@@ -232,7 +234,7 @@ impl<'a> Formatter<'a> {
232
234
if self
233
235
. options
234
236
. max_inline_arguments
235
- . map_or ( true , |limit| limit < self . line_len_next ( query ) )
237
+ . map_or ( true , |limit| limit < self . span_len )
236
238
{
237
239
self . add_new_line ( query) ;
238
240
} else {
@@ -256,6 +258,7 @@ impl<'a> Formatter<'a> {
256
258
257
259
// Opening parentheses increase the block indent level and start a new line
258
260
fn format_opening_parentheses ( & mut self , token : & Token < ' _ > , query : & mut String ) {
261
+ self . block_level += 1 ;
259
262
const PRESERVE_WHITESPACE_FOR : & [ TokenKind ] = & [
260
263
TokenKind :: Whitespace ,
261
264
TokenKind :: OpenParen ,
@@ -304,6 +307,7 @@ impl<'a> Formatter<'a> {
304
307
305
308
// Closing parentheses decrease the block indent level
306
309
fn format_closing_parentheses ( & mut self , token : & Token < ' _ > , query : & mut String ) {
310
+ self . block_level = self . block_level . saturating_sub ( 1 ) ;
307
311
let mut token = token. clone ( ) ;
308
312
let value = match (
309
313
self . options . uppercase ,
@@ -367,7 +371,7 @@ impl<'a> Formatter<'a> {
367
371
}
368
372
369
373
if matches ! ( ( self . previous_top_level_reserved_word, self . options. max_inline_arguments) ,
370
- ( Some ( word) , Some ( limit) ) if word. value. to_lowercase( ) == "select" && limit > self . line_len_next ( query ) )
374
+ ( Some ( word) , Some ( limit) ) if [ "select" , "from" ] . contains ( & word. value. to_lowercase( ) . as_str ( ) ) && limit > self . span_len )
371
375
{
372
376
return ;
373
377
}
@@ -394,7 +398,7 @@ impl<'a> Formatter<'a> {
394
398
}
395
399
}
396
400
397
- fn add_new_line ( & mut self , query : & mut String ) {
401
+ fn add_new_line ( & self , query : & mut String ) {
398
402
self . trim_spaces_end ( query) ;
399
403
if self . options . inline {
400
404
query. push ( ' ' ) ;
@@ -403,7 +407,6 @@ impl<'a> Formatter<'a> {
403
407
if !query. ends_with ( '\n' ) {
404
408
query. push ( '\n' ) ;
405
409
}
406
- self . line_start = query. len ( ) ;
407
410
query. push_str ( & self . indentation . get_indent ( ) ) ;
408
411
}
409
412
@@ -490,16 +493,25 @@ impl<'a> Formatter<'a> {
490
493
}
491
494
}
492
495
493
- fn line_len_next ( & self , query : & str ) -> usize {
494
- query. len ( ) - self . line_start + self . next_token ( 1 ) . map_or ( 0 , |t| t. value . len ( ) )
495
- }
496
-
497
496
fn top_level_tokens_span ( & self ) -> usize {
498
497
assert_eq ! ( self . tokens[ self . index] . kind, TokenKind :: ReservedTopLevel ) ;
498
+ let mut block_level = self . block_level ;
499
499
500
500
self . tokens [ self . index ..]
501
501
. iter ( )
502
502
. skip ( 1 )
503
+ . take_while ( |token| match token. kind {
504
+ TokenKind :: OpenParen => {
505
+ block_level += 1 ;
506
+ true
507
+ }
508
+ TokenKind :: CloseParen => {
509
+ block_level = block_level. saturating_sub ( 1 ) ;
510
+ block_level > self . block_level
511
+ }
512
+ TokenKind :: ReservedTopLevel => false ,
513
+ _ => true ,
514
+ } )
503
515
. map ( |token| token. value . len ( ) )
504
516
. sum ( )
505
517
}
0 commit comments