@@ -4,7 +4,7 @@ use crate::indentation::Indentation;
4
4
use crate :: inline_block:: InlineBlock ;
5
5
use crate :: params:: Params ;
6
6
use crate :: tokenizer:: { Token , TokenKind } ;
7
- use crate :: { FormatOptions , QueryParams } ;
7
+ use crate :: { FormatOptions , QueryParams , SpanInfo } ;
8
8
9
9
// -- fmt: off
10
10
// -- fmt: on
@@ -101,10 +101,6 @@ pub(crate) fn format(
101
101
formatter. format_newline_reserved_word ( token, & mut formatted_query) ;
102
102
formatter. previous_reserved_word = Some ( token) ;
103
103
}
104
- TokenKind :: Join => {
105
- formatter. format_newline_reserved_word ( token, & mut formatted_query) ;
106
- formatter. previous_reserved_word = Some ( token) ;
107
- }
108
104
TokenKind :: Reserved => {
109
105
formatter. format_with_spaces ( token, & mut formatted_query) ;
110
106
formatter. previous_reserved_word = Some ( token) ;
@@ -167,14 +163,8 @@ impl<'a> Formatter<'a> {
167
163
indentation : Indentation :: new ( options) ,
168
164
inline_block : InlineBlock :: new (
169
165
options. max_inline_block ,
170
- match ( options. max_inline_arguments , options. max_inline_top_level ) {
171
- ( Some ( max_inline_args) , Some ( max_inline_top) ) => {
172
- max_inline_args. min ( max_inline_top)
173
- }
174
- ( Some ( max_inline_args) , None ) => max_inline_args,
175
- ( None , Some ( max_inline_top) ) => max_inline_top,
176
- ( None , None ) => 0 ,
177
- } ,
166
+ options. max_inline_arguments . unwrap_or ( 0 ) ,
167
+ options. max_inline_top_level . unwrap_or ( 0 ) ,
178
168
) ,
179
169
block_level : 0 ,
180
170
}
@@ -215,12 +205,12 @@ impl<'a> Formatter<'a> {
215
205
self . add_new_line ( query) ;
216
206
}
217
207
218
- // if we are inside an inline block we decide our behaviour as if we are an inline argument
219
- fn top_level_behavior ( & self ) -> ( bool , bool ) {
220
- let span_len = self . top_level_tokens_span ( ) ;
208
+ // if we are inside an inline block we decide our behaviour as if were inline
209
+ fn top_level_behavior ( & self , span_info : & SpanInfo ) -> ( bool , bool ) {
210
+ let span_len = span_info . full_span ;
221
211
let block_len = self . inline_block . cur_len ( ) ;
222
212
if block_len > 0 {
223
- let limit = self . options . max_inline_arguments . unwrap_or ( 0 ) ;
213
+ let limit = self . options . max_inline_top_level . unwrap_or ( 0 ) ;
224
214
( limit < block_len, limit < span_len)
225
215
} else {
226
216
(
@@ -233,24 +223,25 @@ impl<'a> Formatter<'a> {
233
223
}
234
224
235
225
fn format_top_level_reserved_word ( & mut self , token : & Token < ' _ > , query : & mut String ) {
236
- let span_len = self . top_level_tokens_span ( ) ;
237
- let ( newline_before, newline_after) = self . top_level_behavior ( ) ;
226
+ let span_info = self . top_level_tokens_info ( ) ;
227
+ let ( newline_before, newline_after) = self . top_level_behavior ( & span_info ) ;
238
228
239
229
if newline_before {
240
230
self . indentation . decrease_top_level ( ) ;
241
231
self . add_new_line ( query) ;
242
232
}
243
233
query. push_str ( & self . equalize_whitespace ( & self . format_reserved_word ( token. value ) ) ) ;
244
234
if newline_after {
245
- self . indentation . increase_top_level ( span_len ) ;
235
+ self . indentation . increase_top_level ( span_info ) ;
246
236
self . add_new_line ( query) ;
247
237
} else {
248
238
query. push ( ' ' ) ;
249
239
}
250
240
}
251
241
252
242
fn format_top_level_reserved_word_no_indent ( & mut self , token : & Token < ' _ > , query : & mut String ) {
253
- let ( newline_before, newline_after) = self . top_level_behavior ( ) ;
243
+ let span_info = self . top_level_tokens_info ( ) ;
244
+ let ( newline_before, newline_after) = self . top_level_behavior ( & span_info) ;
254
245
255
246
if newline_before {
256
247
self . indentation . decrease_top_level ( ) ;
@@ -263,10 +254,11 @@ impl<'a> Formatter<'a> {
263
254
}
264
255
265
256
fn format_newline_reserved_word ( & mut self , token : & Token < ' _ > , query : & mut String ) {
266
- if self
267
- . options
268
- . max_inline_arguments
269
- . map_or ( true , |limit| limit < self . indentation . top_level_span ( ) )
257
+ if !self . inline_block . is_active ( )
258
+ && self
259
+ . options
260
+ . max_inline_arguments
261
+ . map_or ( true , |limit| limit < self . indentation . span ( ) )
270
262
{
271
263
self . add_new_line ( query) ;
272
264
} else {
@@ -406,7 +398,7 @@ impl<'a> Formatter<'a> {
406
398
407
399
if matches ! ( ( self . previous_top_level_reserved_word, self . options. max_inline_arguments) ,
408
400
( Some ( word) , Some ( limit) ) if [ "select" , "from" ] . contains( & word. value. to_lowercase( ) . as_str( ) ) &&
409
- limit > self . indentation. top_level_span ( ) )
401
+ limit > self . indentation. span ( ) )
410
402
{
411
403
return ;
412
404
}
@@ -528,28 +520,33 @@ impl<'a> Formatter<'a> {
528
520
}
529
521
}
530
522
531
- fn top_level_tokens_span ( & self ) -> usize {
523
+ fn top_level_tokens_info ( & self ) -> SpanInfo {
532
524
let mut block_level = self . block_level ;
525
+ let mut full_span = 0 ;
533
526
534
- self . tokens [ self . index ..]
535
- . iter ( )
536
- . skip ( 1 )
537
- . take_while ( |token| match token. kind {
527
+ for token in self . tokens [ self . index ..] . iter ( ) . skip ( 1 ) {
528
+ match token. kind {
538
529
TokenKind :: OpenParen => {
539
530
block_level += 1 ;
540
- true
541
531
}
542
532
TokenKind :: CloseParen => {
543
533
block_level = block_level. saturating_sub ( 1 ) ;
544
- block_level > self . block_level
534
+ if block_level < self . block_level {
535
+ break ;
536
+ }
545
537
}
546
538
TokenKind :: ReservedTopLevel | TokenKind :: ReservedTopLevelNoIndent => {
547
- block_level != self . block_level
539
+ if block_level == self . block_level {
540
+ break ;
541
+ }
548
542
}
549
- _ => true ,
550
- } )
551
- . map ( |token| token. value . len ( ) )
552
- . sum ( )
543
+ _ => { }
544
+ }
545
+
546
+ full_span += token. value . len ( ) ;
547
+ }
548
+
549
+ SpanInfo { full_span }
553
550
}
554
551
555
552
fn format_no_change ( & self , token : & Token < ' _ > , query : & mut String ) {
0 commit comments