Skip to content

Commit

Permalink
Auto merge of rust-lang#9601 - evantypanski:et/issue9575, r=Manishearth
Browse files Browse the repository at this point in the history
[`match_single_binding`] Add curlies for more cases to fix suggestion causes error

Fixes rust-lang#9575

changelog: [`match_single_binding`]: Add curlies for scrutinees with side effects for more cases
  • Loading branch information
bors committed Oct 6, 2022
2 parents 8f1ebdd + 39164ac commit 3690199
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 10 deletions.
31 changes: 22 additions & 9 deletions clippy_lints/src/matches/match_single_binding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ pub(crate) fn check<'a>(cx: &LateContext<'a>, ex: &Expr<'a>, arms: &[Arm<'_>], e
&snippet_body,
&mut applicability,
Some(span),
true,
);

span_lint_and_sugg(
Expand Down Expand Up @@ -90,6 +91,7 @@ pub(crate) fn check<'a>(cx: &LateContext<'a>, ex: &Expr<'a>, arms: &[Arm<'_>], e
&snippet_body,
&mut applicability,
None,
true,
);
(expr.span, sugg)
},
Expand All @@ -107,10 +109,14 @@ pub(crate) fn check<'a>(cx: &LateContext<'a>, ex: &Expr<'a>, arms: &[Arm<'_>], e
},
PatKind::Wild => {
if ex.can_have_side_effects() {
let indent = " ".repeat(indent_of(cx, expr.span).unwrap_or(0));
let sugg = format!(
"{};\n{indent}{snippet_body}",
snippet_with_applicability(cx, ex.span, "..", &mut applicability)
let sugg = sugg_with_curlies(
cx,
(ex, expr),
(bind_names, matched_vars),
&snippet_body,
&mut applicability,
None,
false,
);

span_lint_and_sugg(
Expand Down Expand Up @@ -169,6 +175,7 @@ fn sugg_with_curlies<'a>(
snippet_body: &str,
applicability: &mut Applicability,
assignment: Option<Span>,
needs_var_binding: bool,
) -> String {
let mut indent = " ".repeat(indent_of(cx, ex.span).unwrap_or(0));

Expand Down Expand Up @@ -200,9 +207,15 @@ fn sugg_with_curlies<'a>(
s
});

format!(
"{cbrace_start}let {} = {};\n{indent}{assignment_str}{snippet_body}{cbrace_end}",
snippet_with_applicability(cx, bind_names, "..", applicability),
snippet_with_applicability(cx, matched_vars, "..", applicability)
)
let scrutinee = if needs_var_binding {
format!(
"let {} = {}",
snippet_with_applicability(cx, bind_names, "..", applicability),
snippet_with_applicability(cx, matched_vars, "..", applicability)
)
} else {
snippet_with_applicability(cx, matched_vars, "..", applicability).to_string()
};

format!("{cbrace_start}{scrutinee};\n{indent}{assignment_str}{snippet_body}{cbrace_end}")
}
9 changes: 9 additions & 0 deletions tests/ui/match_single_binding.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,12 @@ fn issue_8723() {

let _ = val;
}

#[allow(dead_code)]
fn issue_9575() {
fn side_effects() {}
let _ = || {
side_effects();
println!("Needs curlies");
};
}
8 changes: 8 additions & 0 deletions tests/ui/match_single_binding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,11 @@ fn issue_8723() {

let _ = val;
}

#[allow(dead_code)]
fn issue_9575() {
fn side_effects() {}
let _ = || match side_effects() {
_ => println!("Needs curlies"),
};
}
19 changes: 18 additions & 1 deletion tests/ui/match_single_binding.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -196,5 +196,22 @@ LL + suf
LL ~ };
|

error: aborting due to 13 previous errors
error: this match could be replaced by its scrutinee and body
--> $DIR/match_single_binding.rs:147:16
|
LL | let _ = || match side_effects() {
| ________________^
LL | | _ => println!("Needs curlies"),
LL | | };
| |_____^
|
help: consider using the scrutinee and body instead
|
LL ~ let _ = || {
LL + side_effects();
LL + println!("Needs curlies");
LL ~ };
|

error: aborting due to 14 previous errors

0 comments on commit 3690199

Please sign in to comment.