Skip to content

Commit 28be779

Browse files
fix: nested comments in control flow condition pat
1 parent a15e97f commit 28be779

File tree

3 files changed

+130
-9
lines changed

3 files changed

+130
-9
lines changed

src/patterns.rs

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,26 +89,81 @@ impl Rewrite for Pat {
8989
PatKind::Box(ref pat) => rewrite_unary_prefix(context, "box ", &**pat, shape),
9090
PatKind::Ident(binding_mode, ident, ref sub_pat) => {
9191
let (prefix, mutability) = match binding_mode {
92-
BindingMode::ByRef(mutability) => ("ref ", mutability),
92+
BindingMode::ByRef(mutability) => ("ref", mutability),
9393
BindingMode::ByValue(mutability) => ("", mutability),
9494
};
95-
let mut_infix = format_mutability(mutability);
95+
let mut_infix = format_mutability(mutability).trim();
9696
let id_str = rewrite_ident(context, ident);
9797
let sub_pat = match *sub_pat {
9898
Some(ref p) => {
99-
// 3 - ` @ `.
99+
// 2 - `@ `.
100100
let width = shape
101101
.width
102-
.checked_sub(prefix.len() + mut_infix.len() + id_str.len() + 3)?;
103-
format!(
104-
" @ {}",
105-
p.rewrite(context, Shape::legacy(width, shape.indent))?
106-
)
102+
.checked_sub(prefix.len() + mut_infix.len() + id_str.len() + 2)?;
103+
let lo = context.snippet_provider.span_after(self.span, "@");
104+
combine_strs_with_missing_comments(
105+
context,
106+
"@",
107+
&p.rewrite(context, Shape::legacy(width, shape.indent))?,
108+
mk_sp(lo, p.span.lo()),
109+
shape,
110+
true,
111+
)?
107112
}
108113
None => "".to_owned(),
109114
};
110115

111-
Some(format!("{}{}{}{}", prefix, mut_infix, id_str, sub_pat))
116+
// combine prefix and mut
117+
let (first_lo, first) = if !prefix.is_empty() && !mut_infix.is_empty() {
118+
let hi = context.snippet_provider.span_before(self.span, "mut");
119+
let lo = context.snippet_provider.span_after(self.span, "ref");
120+
(
121+
context.snippet_provider.span_after(self.span, "mut"),
122+
combine_strs_with_missing_comments(
123+
context,
124+
prefix,
125+
mut_infix,
126+
mk_sp(lo, hi),
127+
shape,
128+
true,
129+
)?,
130+
)
131+
} else if !prefix.is_empty() {
132+
(
133+
context.snippet_provider.span_after(self.span, "ref"),
134+
prefix.to_owned(),
135+
)
136+
} else if !mut_infix.is_empty() {
137+
(
138+
context.snippet_provider.span_after(self.span, "mut"),
139+
mut_infix.to_owned(),
140+
)
141+
} else {
142+
(self.span.lo(), "".to_owned())
143+
};
144+
145+
let next = if !sub_pat.is_empty() {
146+
let hi = context.snippet_provider.span_before(self.span, "@");
147+
combine_strs_with_missing_comments(
148+
context,
149+
id_str,
150+
&sub_pat,
151+
mk_sp(ident.span.hi(), hi),
152+
shape,
153+
true,
154+
)?
155+
} else {
156+
id_str.to_owned()
157+
};
158+
159+
combine_strs_with_missing_comments(
160+
context,
161+
&first,
162+
&next,
163+
mk_sp(first_lo, ident.span.lo()),
164+
shape,
165+
true,
166+
)
112167
}
113168
PatKind::Wild => {
114169
if 1 <= shape.width {

tests/source/issue_3853.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
fn by_ref_with_block_before_ident() {
2+
if let Some(ref /*def*/ state)= foo{
3+
println!(
4+
"asdfasdfasdf"); }
5+
}
6+
7+
fn mut_block_before_ident() {
8+
if let Some(mut /*def*/ state ) =foo{
9+
println!(
10+
"123" ); }
11+
}
12+
13+
fn ref_and_mut_blocks_before_ident() {
14+
if let Some(ref /*abc*/
15+
mut /*def*/ state ) = foo {
16+
println!(
17+
"deefefefefefwea" ); }
18+
}
19+
20+
fn sub_pattern() {
21+
let foo @ /*foo*/
22+
bar(f) = 42;
23+
}
24+
25+
fn no_prefix_block_before_ident() {
26+
if let Some(
27+
/*def*/ state ) = foo {
28+
println!(
29+
"129387123123" ); }
30+
}
31+
32+
fn issue_3853() {
33+
if let Some(ref /*mut*/ state) = foo {
34+
}
35+
}

tests/target/issue_3853.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
fn by_ref_with_block_before_ident() {
2+
if let Some(ref /*def*/ state) = foo {
3+
println!("asdfasdfasdf");
4+
}
5+
}
6+
7+
fn mut_block_before_ident() {
8+
if let Some(mut /*def*/ state) = foo {
9+
println!("123");
10+
}
11+
}
12+
13+
fn ref_and_mut_blocks_before_ident() {
14+
if let Some(ref /*abc*/ mut /*def*/ state) = foo {
15+
println!("deefefefefefwea");
16+
}
17+
}
18+
19+
fn sub_pattern() {
20+
let foo @ /*foo*/ bar(f) = 42;
21+
}
22+
23+
fn no_prefix_block_before_ident() {
24+
if let Some(/*def*/ state) = foo {
25+
println!("129387123123");
26+
}
27+
}
28+
29+
fn issue_3853() {
30+
if let Some(ref /*mut*/ state) = foo {}
31+
}

0 commit comments

Comments
 (0)