From 28be77915f5b6750f0390e233a44499f2c3f2547 Mon Sep 17 00:00:00 2001 From: Caleb Cartwright Date: Thu, 17 Oct 2019 19:58:08 -0500 Subject: [PATCH] fix: nested comments in control flow condition pat --- src/patterns.rs | 73 +++++++++++++++++++++++++++++++++----- tests/source/issue_3853.rs | 35 ++++++++++++++++++ tests/target/issue_3853.rs | 31 ++++++++++++++++ 3 files changed, 130 insertions(+), 9 deletions(-) create mode 100644 tests/source/issue_3853.rs create mode 100644 tests/target/issue_3853.rs diff --git a/src/patterns.rs b/src/patterns.rs index e81631d1662..baa39dbbce6 100644 --- a/src/patterns.rs +++ b/src/patterns.rs @@ -89,26 +89,81 @@ impl Rewrite for Pat { PatKind::Box(ref pat) => rewrite_unary_prefix(context, "box ", &**pat, shape), PatKind::Ident(binding_mode, ident, ref sub_pat) => { let (prefix, mutability) = match binding_mode { - BindingMode::ByRef(mutability) => ("ref ", mutability), + BindingMode::ByRef(mutability) => ("ref", mutability), BindingMode::ByValue(mutability) => ("", mutability), }; - let mut_infix = format_mutability(mutability); + let mut_infix = format_mutability(mutability).trim(); let id_str = rewrite_ident(context, ident); let sub_pat = match *sub_pat { Some(ref p) => { - // 3 - ` @ `. + // 2 - `@ `. let width = shape .width - .checked_sub(prefix.len() + mut_infix.len() + id_str.len() + 3)?; - format!( - " @ {}", - p.rewrite(context, Shape::legacy(width, shape.indent))? - ) + .checked_sub(prefix.len() + mut_infix.len() + id_str.len() + 2)?; + let lo = context.snippet_provider.span_after(self.span, "@"); + combine_strs_with_missing_comments( + context, + "@", + &p.rewrite(context, Shape::legacy(width, shape.indent))?, + mk_sp(lo, p.span.lo()), + shape, + true, + )? } None => "".to_owned(), }; - Some(format!("{}{}{}{}", prefix, mut_infix, id_str, sub_pat)) + // combine prefix and mut + let (first_lo, first) = if !prefix.is_empty() && !mut_infix.is_empty() { + let hi = context.snippet_provider.span_before(self.span, "mut"); + let lo = context.snippet_provider.span_after(self.span, "ref"); + ( + context.snippet_provider.span_after(self.span, "mut"), + combine_strs_with_missing_comments( + context, + prefix, + mut_infix, + mk_sp(lo, hi), + shape, + true, + )?, + ) + } else if !prefix.is_empty() { + ( + context.snippet_provider.span_after(self.span, "ref"), + prefix.to_owned(), + ) + } else if !mut_infix.is_empty() { + ( + context.snippet_provider.span_after(self.span, "mut"), + mut_infix.to_owned(), + ) + } else { + (self.span.lo(), "".to_owned()) + }; + + let next = if !sub_pat.is_empty() { + let hi = context.snippet_provider.span_before(self.span, "@"); + combine_strs_with_missing_comments( + context, + id_str, + &sub_pat, + mk_sp(ident.span.hi(), hi), + shape, + true, + )? + } else { + id_str.to_owned() + }; + + combine_strs_with_missing_comments( + context, + &first, + &next, + mk_sp(first_lo, ident.span.lo()), + shape, + true, + ) } PatKind::Wild => { if 1 <= shape.width { diff --git a/tests/source/issue_3853.rs b/tests/source/issue_3853.rs new file mode 100644 index 00000000000..d2cd9a98a1f --- /dev/null +++ b/tests/source/issue_3853.rs @@ -0,0 +1,35 @@ +fn by_ref_with_block_before_ident() { +if let Some(ref /*def*/ state)= foo{ + println!( + "asdfasdfasdf"); } +} + +fn mut_block_before_ident() { +if let Some(mut /*def*/ state ) =foo{ + println!( + "123" ); } +} + +fn ref_and_mut_blocks_before_ident() { +if let Some(ref /*abc*/ + mut /*def*/ state ) = foo { + println!( + "deefefefefefwea" ); } +} + +fn sub_pattern() { + let foo @ /*foo*/ +bar(f) = 42; +} + +fn no_prefix_block_before_ident() { +if let Some( + /*def*/ state ) = foo { + println!( + "129387123123" ); } +} + +fn issue_3853() { +if let Some(ref /*mut*/ state) = foo { + } +} diff --git a/tests/target/issue_3853.rs b/tests/target/issue_3853.rs new file mode 100644 index 00000000000..53b94d3fc00 --- /dev/null +++ b/tests/target/issue_3853.rs @@ -0,0 +1,31 @@ +fn by_ref_with_block_before_ident() { + if let Some(ref /*def*/ state) = foo { + println!("asdfasdfasdf"); + } +} + +fn mut_block_before_ident() { + if let Some(mut /*def*/ state) = foo { + println!("123"); + } +} + +fn ref_and_mut_blocks_before_ident() { + if let Some(ref /*abc*/ mut /*def*/ state) = foo { + println!("deefefefefefwea"); + } +} + +fn sub_pattern() { + let foo @ /*foo*/ bar(f) = 42; +} + +fn no_prefix_block_before_ident() { + if let Some(/*def*/ state) = foo { + println!("129387123123"); + } +} + +fn issue_3853() { + if let Some(ref /*mut*/ state) = foo {} +}