From 9386b32f5a72bb276a97461d33aab415314201d8 Mon Sep 17 00:00:00 2001 From: Yacin Tmimi Date: Sat, 1 Apr 2023 11:02:27 -0400 Subject: [PATCH] wrap `else {` for long, single-lined initializer expressions This helps to prevent max width errors. --- src/items.rs | 6 ++++-- tests/source/let_else.rs | 12 ++++++------ tests/target/let_else.rs | 18 ++++++++++-------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/items.rs b/src/items.rs index c2b9a26708d..97a76f6bb32 100644 --- a/src/items.rs +++ b/src/items.rs @@ -175,8 +175,10 @@ fn same_line_else_kw_and_brace( init_shape: Shape, ) -> bool { if !init_str.contains('\n') { - // initializer expression is single lined so the "else {" should be placed on the same line - return true; + // initializer expression is single lined. The "else {" can only be placed on the same line + // as the initializer expression if there is enough room for it. + // 7 = ` else {` + return init_shape.width.saturating_sub(init_str.len()) >= 7; } // 1. The initializer expression ends with one or more `)`, `]`, `}`. diff --git a/tests/source/let_else.rs b/tests/source/let_else.rs index 78465e64edc..9c02117c6e8 100644 --- a/tests/source/let_else.rs +++ b/tests/source/let_else.rs @@ -79,18 +79,18 @@ fn unbreakable_initializer_expr_pre_formatting_let_else_length_near_max_width() fn unbreakable_initializer_expr_pre_formatting_length_up_to_opening_brace_near_max_width() { // Pre Formatting: - // The length of `(indent)let pat = init else {` is 100 (max_width) + // The length of `(indent)let pat = init else {` is 99 (< max_width) // Post Formatting: // The else keyword and opening brace remain on the same line as the initializer expr, // and the else block is formatted over multiple lines because we can't fit the // else block on the same line as the initializer expr. - let Some(x) = some_really_really_really_really_really_really_really_really_long_name____E else {return}; + let Some(x) = some_really_really_really_really_really_really_really_really_long_name___E else {return}; // Pre Formatting: // The length of `(indent)let pat = init else {` is 101 (> max_width) // Post Formatting: - // The else keyword and opening brace remain on the same line as the initializer expr, - // which leads to the `{` exceeding the max width + // The else keyword and opening brace cannot fit on the same line as the initializer expr. + // They are formatted on the next line. let Some(x) = some_really_really_really_really_really_really_really_really_long_name_____F else {return}; } @@ -98,8 +98,8 @@ fn unbreakable_initializer_expr_pre_formatting_length_through_initializer_expr_n // Pre Formatting: // The length of `(indent)let pat = init` is 99 (< max_width) // Post Formatting: - // The else keyword and opening brace remain on the same line as the initializer expr, - // which leads to the `else {` exceeding the max width + // The else keyword and opening brace cannot fit on the same line as the initializer expr. + // They are formatted on the next line. let Some(x) = some_really_really_really_really_really_really_really_really_really_long_name___G else {return}; // Pre Formatting: diff --git a/tests/target/let_else.rs b/tests/target/let_else.rs index 5ada7d44657..88115d129aa 100644 --- a/tests/target/let_else.rs +++ b/tests/target/let_else.rs @@ -130,21 +130,22 @@ fn unbreakable_initializer_expr_pre_formatting_let_else_length_near_max_width() fn unbreakable_initializer_expr_pre_formatting_length_up_to_opening_brace_near_max_width() { // Pre Formatting: - // The length of `(indent)let pat = init else {` is 100 (max_width) + // The length of `(indent)let pat = init else {` is 99 (< max_width) // Post Formatting: // The else keyword and opening brace remain on the same line as the initializer expr, // and the else block is formatted over multiple lines because we can't fit the // else block on the same line as the initializer expr. - let Some(x) = some_really_really_really_really_really_really_really_really_long_name____E else { + let Some(x) = some_really_really_really_really_really_really_really_really_long_name___E else { return; }; // Pre Formatting: // The length of `(indent)let pat = init else {` is 101 (> max_width) // Post Formatting: - // The else keyword and opening brace remain on the same line as the initializer expr, - // which leads to the `{` exceeding the max width - let Some(x) = some_really_really_really_really_really_really_really_really_long_name_____F else { + // The else keyword and opening brace cannot fit on the same line as the initializer expr. + // They are formatted on the next line. + let Some(x) = some_really_really_really_really_really_really_really_really_long_name_____F + else { return; }; } @@ -153,9 +154,10 @@ fn unbreakable_initializer_expr_pre_formatting_length_through_initializer_expr_n // Pre Formatting: // The length of `(indent)let pat = init` is 99 (< max_width) // Post Formatting: - // The else keyword and opening brace remain on the same line as the initializer expr, - // which leads to the `else {` exceeding the max width - let Some(x) = some_really_really_really_really_really_really_really_really_really_long_name___G else { + // The else keyword and opening brace cannot fit on the same line as the initializer expr. + // They are formatted on the next line. + let Some(x) = some_really_really_really_really_really_really_really_really_really_long_name___G + else { return; };