|
1 | 1 | use std::borrow::Cow; |
| 2 | +use std::usize; |
2 | 3 |
|
3 | 4 | use crate::indentation::Indentation; |
4 | 5 | use crate::inline_block::InlineBlock; |
@@ -344,14 +345,15 @@ impl<'a> Formatter<'a> { |
344 | 345 | let previous_non_whitespace_token = self.previous_non_whitespace_token(1); |
345 | 346 | let fold_in_top_level = !inlined |
346 | 347 | && self.options.max_inline_top_level.is_some() |
347 | | - && self |
348 | | - .previous_non_whitespace_token(1) |
349 | | - .is_some_and(|t| t.kind == TokenKind::ReservedTopLevel) |
| 348 | + && previous_non_whitespace_token.is_some_and(|t| t.kind == TokenKind::ReservedTopLevel) |
350 | 349 | && self |
351 | 350 | .indentation |
352 | 351 | .previous_top_level_reserved() |
353 | 352 | .is_some_and(|(_, span)| { |
354 | | - span.blocks == 1 && span.newline_after && span.arguments == 1 |
| 353 | + // We can have the two following situations |
| 354 | + // top level ( block ) |
| 355 | + // top level ( block ) AS word (args, ...) |
| 356 | + span.blocks <= 2 && span.newline_after && span.arguments == 1 |
355 | 357 | }); |
356 | 358 |
|
357 | 359 | // Take out the preceding space unless there was whitespace there in the original query |
@@ -472,9 +474,9 @@ impl<'a> Formatter<'a> { |
472 | 474 | return; |
473 | 475 | } |
474 | 476 |
|
475 | | - if let Some((_, span)) = self.indentation.previous_top_level_reserved() { |
| 477 | + if let Some((t, span)) = self.indentation.previous_top_level_reserved() { |
476 | 478 | let limit = self.options.max_inline_arguments.unwrap_or(0); |
477 | | - if limit > span.full_span { |
| 479 | + if limit >= span.full_span { |
478 | 480 | return; |
479 | 481 | } |
480 | 482 | } |
@@ -671,18 +673,19 @@ impl<'a> Formatter<'a> { |
671 | 673 | full_span += token.value.len(); |
672 | 674 | } |
673 | 675 |
|
| 676 | + let limit = self.options.max_inline_top_level.unwrap_or(0); |
674 | 677 | // if we are inside an inline block we decide our behaviour as if were inline |
675 | 678 | let block_len = self.inline_block.cur_len(); |
676 | | - let (newline_before, newline_after) = if block_len > 0 { |
677 | | - let limit = self.options.max_inline_top_level.unwrap_or(0); |
678 | | - (limit < block_len, limit < full_span) |
| 679 | + |
| 680 | + let newline_before = block_len == 0 || limit < block_len; |
| 681 | + |
| 682 | + // if we are going to format a list of arguments take in account also the limit for |
| 683 | + // arguments |
| 684 | + let arguments_limit = self.options.max_inline_arguments.unwrap_or(0); |
| 685 | + let newline_after = if arguments > 1 && arguments_limit != 0 { |
| 686 | + arguments_limit.min(limit) < full_span |
679 | 687 | } else { |
680 | | - ( |
681 | | - true, |
682 | | - self.options |
683 | | - .max_inline_top_level |
684 | | - .is_none_or(|limit| limit < full_span), |
685 | | - ) |
| 688 | + limit < full_span |
686 | 689 | }; |
687 | 690 |
|
688 | 691 | SpanInfo { |
|
0 commit comments