From b9cc50963830c6af7c77057b6b05d8fe92fb5336 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Mon, 6 Feb 2023 22:01:24 +0200 Subject: [PATCH] Fix issue #3805 - wrap macro line with width of one char beyond max --- src/macros.rs | 15 ++++-- tests/source/issue-3805.rs | 65 ++++++++++++++++++++++++++ tests/target/issue-3805.rs | 94 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 tests/source/issue-3805.rs create mode 100644 tests/target/issue-3805.rs diff --git a/src/macros.rs b/src/macros.rs index ce7d2ce47e0..6e114c76f26 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -25,6 +25,7 @@ use crate::comment::{ contains_comment, CharClasses, FindUncommented, FullCodeCharKind, LineClasses, }; use crate::config::lists::*; +use crate::config::Version; use crate::expr::{rewrite_array, rewrite_assign_rhs, RhsAssignKind}; use crate::lists::{itemize_list, write_list, ListFormatting}; use crate::overflow; @@ -1245,8 +1246,16 @@ impl MacroBranch { return None; } - // 5 = " => {" - let mut result = format_macro_args(context, self.args.clone(), shape.sub_width(5)?)?; + let old_body = context.snippet(self.body).trim(); + let has_block_body = old_body.starts_with('{'); + let mut prefix_width = 5; // 5 = " => {" + if context.config.version() == Version::Two { + if has_block_body { + prefix_width = 6; // 6 = " => {{" + } + } + let mut result = + format_macro_args(context, self.args.clone(), shape.sub_width(prefix_width)?)?; if multi_branch_style { result += " =>"; @@ -1264,9 +1273,7 @@ impl MacroBranch { // `$$`). We'll try and format like an AST node, but we'll substitute // variables for new names with the same length first. - let old_body = context.snippet(self.body).trim(); let (body_str, substs) = replace_names(old_body)?; - let has_block_body = old_body.starts_with('{'); let mut config = context.config.clone(); config.set().show_parse_errors(false); diff --git a/tests/source/issue-3805.rs b/tests/source/issue-3805.rs new file mode 100644 index 00000000000..a0289b57974 --- /dev/null +++ b/tests/source/issue-3805.rs @@ -0,0 +1,65 @@ +// rustfmt-version: Two +// rustfmt-format_macro_matchers: true + +// From original issue example - Line length 101 +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr) => {{ +return; +}}; +} + +// Spaces between the `{` and `}` +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr) => { { +return; +} }; +} + +// Multi `{}` +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr) => {{{{ +return; +}}}}; +} + +// Multi `{}` with spaces +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr) => { { { { +return; +} } } }; +} + +// Line length 102 +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeiou:expr, $add:expr) => {{ +return; +}}; +} + +// Line length 103 +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeioua:expr, $add:expr) => {{ +return; +}}; +} + +// With extended macro body - Line length 101 +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr) => {{ +let VAR = "VALUE"; return VAR; +}}; +} + +// With extended macro body - Line length 102 +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeiou:expr, $add:expr) => {{ +let VAR = "VALUE"; return VAR; +}}; +} + +// With extended macro body - Line length 103 +macro_rules! test { +($aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeioua:expr, $add:expr) => {{ +let VAR = "VALUE"; return VAR; +}}; +} diff --git a/tests/target/issue-3805.rs b/tests/target/issue-3805.rs new file mode 100644 index 00000000000..a247a43fe6d --- /dev/null +++ b/tests/target/issue-3805.rs @@ -0,0 +1,94 @@ +// rustfmt-version: Two +// rustfmt-format_macro_matchers: true + +// From original issue example - Line length 101 +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr + ) => {{ + return; + }}; +} + +// Spaces between the `{` and `}` +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr + ) => {{ + return; + }}; +} + +// Multi `{}` +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr + ) => {{ + { + { + return; + } + } + }}; +} + +// Multi `{}` with spaces +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr + ) => {{ + { + { + return; + } + } + }}; +} + +// Line length 102 +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeiou:expr, $add:expr + ) => {{ + return; + }}; +} + +// Line length 103 +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeioua:expr, $add:expr + ) => {{ + return; + }}; +} + +// With extended macro body - Line length 101 +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeio:expr, $add:expr + ) => {{ + let VAR = "VALUE"; + return VAR; + }}; +} + +// With extended macro body - Line length 102 +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeiou:expr, $add:expr + ) => {{ + let VAR = "VALUE"; + return VAR; + }}; +} + +// With extended macro body - Line length 103 +macro_rules! test { + ( + $aasdfghj:expr, $qwertyuiop:expr, $zxcvbnmasdfghjkl:expr, $aeiouaeiouaeioua:expr, $add:expr + ) => {{ + let VAR = "VALUE"; + return VAR; + }}; +}