diff --git a/src/lists.rs b/src/lists.rs index 9d811e5d9b5..ee050af6745 100644 --- a/src/lists.rs +++ b/src/lists.rs @@ -11,8 +11,8 @@ use crate::config::{Config, IndentStyle}; use crate::rewrite::{ExceedsMaxWidthError, RewriteContext, RewriteError, RewriteResult}; use crate::shape::{Indent, Shape}; use crate::utils::{ - count_newlines, first_line_width, last_line_width, mk_sp, starts_with_newline, - unicode_str_width, + count_newlines, first_line_width, last_line_unindented_width, last_line_width, mk_sp, + starts_with_newline, unicode_str_width, }; use crate::visitor::SnippetProvider; @@ -468,8 +468,13 @@ where if !starts_with_newline(comment) { if formatting.align_comments { + // If it's a multiline inner item, the length of indentation shouldn't + // be counted when evaluating line length with respect to comments. + let inner_item_width = last_line_unindented_width(&inner_item) + .unwrap_or_else(|| unicode_str_width(inner_item)); + let mut comment_alignment = - post_comment_alignment(item_max_width, unicode_str_width(inner_item)); + post_comment_alignment(item_max_width, inner_item_width); if first_line_width(&formatted_comment) + last_line_width(&result) + comment_alignment diff --git a/src/utils.rs b/src/utils.rs index fcd475b1784..c15cf79afd2 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -208,6 +208,14 @@ pub(crate) fn last_line_width(s: &str) -> usize { unicode_str_width(s.rsplitn(2, '\n').next().unwrap_or("")) } +#[inline] +pub(crate) fn last_line_unindented_width(s: &str) -> Option { + s.rsplitn(2, '\n').next().map(|s| { + let trimmed = s.trim_start(); + unicode_str_width(trimmed) + }) +} + /// The total used width of the last line. #[inline] pub(crate) fn last_line_used_width(s: &str, offset: usize) -> usize { diff --git a/tests/source/issue-6060/line_split.rs b/tests/source/issue-6060/line_split.rs new file mode 100644 index 00000000000..9b92ccec959 --- /dev/null +++ b/tests/source/issue-6060/line_split.rs @@ -0,0 +1,9 @@ +fn dummy() { + let error_code = match err { + msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte + msgs::DecodeError::UnknownRequiredFeature + | msgs::DecodeError::InvalidValue + | msgs::DecodeError::ShortReadNowExceedesMaxLineWidthAndTriggersAnotherBranch => 0x4000 | 22, // invalid_onion + _ => 0x2000 | 2, // Should never happen + }; +} diff --git a/tests/target/issue-6060/line_split.rs b/tests/target/issue-6060/line_split.rs new file mode 100644 index 00000000000..1ac7ea22874 --- /dev/null +++ b/tests/target/issue-6060/line_split.rs @@ -0,0 +1,11 @@ +fn dummy() { + let error_code = match err { + msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte + msgs::DecodeError::UnknownRequiredFeature + | msgs::DecodeError::InvalidValue + | msgs::DecodeError::ShortReadNowExceedesMaxLineWidthAndTriggersAnotherBranch => { + 0x4000 | 22 + } // invalid_onion + _ => 0x2000 | 2, // Should never happen + }; +} diff --git a/tests/target/issue-6060/no_line_split.rs b/tests/target/issue-6060/no_line_split.rs new file mode 100644 index 00000000000..b8f017ca91b --- /dev/null +++ b/tests/target/issue-6060/no_line_split.rs @@ -0,0 +1,9 @@ +fn dummy() { + let error_code = match err { + msgs::DecodeError::UnknownVersion => 0x4000 | 1, // unknown realm byte + msgs::DecodeError::UnknownRequiredFeature + | msgs::DecodeError::InvalidValue + | msgs::DecodeError::ShortRead => 0x4000 | 22, // invalid_onion + _ => 0x2000 | 2, // Should never happen + }; +}