diff --git a/src/macros.rs b/src/macros.rs index b1f740e6a87..a841268ce07 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -309,31 +309,51 @@ fn macro_style(mac: &ast::Mac, context: &RewriteContext) -> MacroStyle { /// } /// ``` fn indent_macro_snippet(macro_str: &str, indent: Indent) -> Option { - let min_prefix_space_width = - try_opt!(macro_str.lines().skip(1).map(get_prefix_space_width).min()); - let mut lines = macro_str.lines(); - let first_line = try_opt!(lines.next()); + let first_line = try_opt!(lines.next().map(|s| s.trim_right())); + let mut trimmed_lines = Vec::with_capacity(16); + + let min_prefix_space_width = try_opt!( + lines + .filter_map(|line| { + let prefix_space_width = if is_empty_line(line) { + None + } else { + get_prefix_space_width(line) + }; + trimmed_lines.push((line.trim(), prefix_space_width)); + prefix_space_width + }) + .min() + ); Some( String::from(first_line) + "\n" + - &lines - .map(|line| { - let new_indent_width = indent.width() + - get_prefix_space_width(line) - .checked_sub(min_prefix_space_width) - .unwrap_or(0); - repeat_white_space(new_indent_width) + line.trim() + &trimmed_lines + .iter() + .map(|&(line, prefix_space_width)| match prefix_space_width { + Some(original_indent_width) => { + let new_indent_width = indent.width() + + original_indent_width + .checked_sub(min_prefix_space_width) + .unwrap_or(0); + repeat_white_space(new_indent_width) + line.trim() + } + None => String::new(), }) .collect::>() .join("\n"), ) } -fn get_prefix_space_width(s: &str) -> usize { - s.chars().position(|c| c != ' ').unwrap_or(0) +fn get_prefix_space_width(s: &str) -> Option { + s.chars().position(|c| c != ' ') } fn repeat_white_space(ws_count: usize) -> String { repeat(" ").take(ws_count).collect::() } + +fn is_empty_line(s: &str) -> bool { + s.is_empty() || s.chars().all(char::is_whitespace) +} diff --git a/tests/source/macros.rs b/tests/source/macros.rs index d8e6efe9199..aa2861ecd17 100644 --- a/tests/source/macros.rs +++ b/tests/source/macros.rs @@ -134,6 +134,21 @@ fn issue_1885() { }).collect::>(); } +fn issue_1917() { + mod x { + quickcheck! { + fn test(a: String, s: String, b: String) -> TestResult { + if a.find(&s).is_none() { + + TestResult::from_bool(true) + } else { + TestResult::discard() + } + } + } + } +} + // Put the following tests with macro invocations whose arguments cannot be parsed as expressioins // at the end of the file for now. diff --git a/tests/target/macros.rs b/tests/target/macros.rs index 21c0b983ff9..cbe15f9f7f7 100644 --- a/tests/target/macros.rs +++ b/tests/target/macros.rs @@ -178,6 +178,21 @@ fn issue_1885() { .collect::>(); } +fn issue_1917() { + mod x { + quickcheck! { + fn test(a: String, s: String, b: String) -> TestResult { + if a.find(&s).is_none() { + + TestResult::from_bool(true) + } else { + TestResult::discard() + } + } + } + } +} + // Put the following tests with macro invocations whose arguments cannot be parsed as expressioins // at the end of the file for now.