@@ -101,6 +101,10 @@ 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
+ }
104
108
TokenKind :: Reserved => {
105
109
formatter. format_with_spaces ( token, & mut formatted_query) ;
106
110
formatter. previous_reserved_word = Some ( token) ;
@@ -163,7 +167,14 @@ impl<'a> Formatter<'a> {
163
167
indentation : Indentation :: new ( options) ,
164
168
inline_block : InlineBlock :: new (
165
169
options. max_inline_block ,
166
- options. max_inline_arguments . is_none ( ) ,
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
+ } ,
167
178
) ,
168
179
block_level : 0 ,
169
180
}
@@ -204,28 +215,51 @@ impl<'a> Formatter<'a> {
204
215
self . add_new_line ( query) ;
205
216
}
206
217
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 ( ) ;
221
+ let block_len = self . inline_block . cur_len ( ) ;
222
+ if block_len > 0 {
223
+ let limit = self . options . max_inline_arguments . unwrap_or ( 0 ) ;
224
+ ( limit < block_len, limit < span_len)
225
+ } else {
226
+ (
227
+ true ,
228
+ self . options
229
+ . max_inline_top_level
230
+ . map_or ( true , |limit| limit < span_len) ,
231
+ )
232
+ }
233
+ }
234
+
207
235
fn format_top_level_reserved_word ( & mut self , token : & Token < ' _ > , query : & mut String ) {
208
236
let span_len = self . top_level_tokens_span ( ) ;
209
- self . indentation . decrease_top_level ( ) ;
210
- self . add_new_line ( query) ;
211
- self . indentation . increase_top_level ( span_len) ;
237
+ let ( newline_before, newline_after) = self . top_level_behavior ( ) ;
238
+
239
+ if newline_before {
240
+ self . indentation . decrease_top_level ( ) ;
241
+ self . add_new_line ( query) ;
242
+ }
212
243
query. push_str ( & self . equalize_whitespace ( & self . format_reserved_word ( token. value ) ) ) ;
213
- if self
214
- . options
215
- . max_inline_top_level
216
- . map_or ( true , |limit| limit < span_len)
217
- {
244
+ if newline_after {
245
+ self . indentation . increase_top_level ( span_len) ;
218
246
self . add_new_line ( query) ;
219
247
} else {
220
248
query. push ( ' ' ) ;
221
249
}
222
250
}
223
251
224
252
fn format_top_level_reserved_word_no_indent ( & mut self , token : & Token < ' _ > , query : & mut String ) {
225
- self . indentation . decrease_top_level ( ) ;
226
- self . add_new_line ( query) ;
253
+ let ( newline_before, newline_after) = self . top_level_behavior ( ) ;
254
+
255
+ if newline_before {
256
+ self . indentation . decrease_top_level ( ) ;
257
+ self . add_new_line ( query) ;
258
+ }
227
259
query. push_str ( & self . equalize_whitespace ( & self . format_reserved_word ( token. value ) ) ) ;
228
- self . add_new_line ( query) ;
260
+ if newline_after {
261
+ self . add_new_line ( query) ;
262
+ }
229
263
}
230
264
231
265
fn format_newline_reserved_word ( & mut self , token : & Token < ' _ > , query : & mut String ) {
@@ -297,8 +331,9 @@ impl<'a> Formatter<'a> {
297
331
298
332
self . inline_block . begin_if_possible ( self . tokens , self . index ) ;
299
333
334
+ self . indentation . increase_block_level ( ) ;
335
+
300
336
if !self . inline_block . is_active ( ) {
301
- self . indentation . increase_block_level ( ) ;
302
337
self . add_new_line ( query) ;
303
338
}
304
339
}
@@ -330,6 +365,8 @@ impl<'a> Formatter<'a> {
330
365
331
366
token. value = & value;
332
367
368
+ self . indentation . decrease_block_level ( ) ;
369
+
333
370
if self . inline_block . is_active ( ) {
334
371
self . inline_block . end ( ) ;
335
372
if token. value . to_lowercase ( ) == "end" {
@@ -340,7 +377,6 @@ impl<'a> Formatter<'a> {
340
377
self . format_with_space_after ( & token, query) ;
341
378
}
342
379
} else {
343
- self . indentation . decrease_block_level ( ) ;
344
380
self . add_new_line ( query) ;
345
381
self . format_with_spaces ( & token, query) ;
346
382
}
@@ -493,7 +529,6 @@ impl<'a> Formatter<'a> {
493
529
}
494
530
495
531
fn top_level_tokens_span ( & self ) -> usize {
496
- assert_eq ! ( self . tokens[ self . index] . kind, TokenKind :: ReservedTopLevel ) ;
497
532
let mut block_level = self . block_level ;
498
533
499
534
self . tokens [ self . index ..]
@@ -508,7 +543,9 @@ impl<'a> Formatter<'a> {
508
543
block_level = block_level. saturating_sub ( 1 ) ;
509
544
block_level > self . block_level
510
545
}
511
- TokenKind :: ReservedTopLevel => block_level != self . block_level ,
546
+ TokenKind :: ReservedTopLevel | TokenKind :: ReservedTopLevelNoIndent => {
547
+ block_level != self . block_level
548
+ }
512
549
_ => true ,
513
550
} )
514
551
. map ( |token| token. value . len ( ) )
0 commit comments