Skip to content

Commit

Permalink
manual-unwrap-or / pr remarks, round 3
Browse files Browse the repository at this point in the history
  • Loading branch information
tnielens committed Oct 24, 2020
1 parent 6533d8b commit 0d21ae0
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 17 deletions.
13 changes: 3 additions & 10 deletions clippy_lints/src/manual_unwrap_or.rs
@@ -1,5 +1,6 @@
use crate::consts::constant_simple;
use crate::utils;
use crate::utils::sugg;
use if_chain::if_chain;
use rustc_errors::Applicability;
use rustc_hir::{def, Arm, Expr, ExprKind, Pat, PatKind, QPath};
Expand Down Expand Up @@ -104,28 +105,20 @@ fn lint_manual_unwrap_or<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
None
};
if let Some(or_arm) = applicable_or_arm(match_arms);
if let Some(scrutinee_snippet) = utils::snippet_opt(cx, scrutinee.span);
if let Some(or_body_snippet) = utils::snippet_opt(cx, or_arm.body.span);
if let Some(indent) = utils::indent_of(cx, expr.span);
if constant_simple(cx, cx.typeck_results(), or_arm.body).is_some();
then {
let reindented_or_body =
utils::reindent_multiline(or_body_snippet.into(), true, Some(indent));
let wrap_in_parens = !matches!(scrutinee, Expr {
kind: ExprKind::Call(..) | ExprKind::Path(_), ..
});
let l_paren = if wrap_in_parens { "(" } else { "" };
let r_paren = if wrap_in_parens { ")" } else { "" };
utils::span_lint_and_sugg(
cx,
MANUAL_UNWRAP_OR, expr.span,
&format!("this pattern reimplements `{}`", case.unwrap_fn_path()),
"replace with",
format!(
"{}{}{}.unwrap_or({})",
l_paren,
scrutinee_snippet,
r_paren,
"{}.unwrap_or({})",
sugg::Sugg::hir(cx, scrutinee, "..").maybe_par(),
reindented_or_body,
),
Applicability::MachineApplicable,
Expand Down
12 changes: 11 additions & 1 deletion tests/ui/manual_unwrap_or.fixed
Expand Up @@ -74,9 +74,19 @@ fn result_unwrap_or() {
let a = Ok::<i32, &str>(1);
a.unwrap_or(42);

// int case, suggestion must surround with parenthesis
// int case, suggestion must surround Result expr with parenthesis
(Ok(1) as Result<i32, &str>).unwrap_or(42);

// method call case, suggestion must not surround Result expr `s.method()` with parenthesis
struct S {}
impl S {
fn method(self) -> Option<i32> {
Some(42)
}
}
let s = S {};
s.method().unwrap_or(42);

// int case reversed
Ok::<i32, &str>(1).unwrap_or(42);

Expand Down
15 changes: 14 additions & 1 deletion tests/ui/manual_unwrap_or.rs
Expand Up @@ -95,12 +95,25 @@ fn result_unwrap_or() {
Err(_) => 42,
};

// int case, suggestion must surround with parenthesis
// int case, suggestion must surround Result expr with parenthesis
match Ok(1) as Result<i32, &str> {
Ok(i) => i,
Err(_) => 42,
};

// method call case, suggestion must not surround Result expr `s.method()` with parenthesis
struct S {}
impl S {
fn method(self) -> Option<i32> {
Some(42)
}
}
let s = S {};
match s.method() {
Some(i) => i,
None => 42,
};

// int case reversed
match Ok::<i32, &str>(1) {
Err(_) => 42,
Expand Down
19 changes: 14 additions & 5 deletions tests/ui/manual_unwrap_or.stderr
Expand Up @@ -84,8 +84,17 @@ LL | | Err(_) => 42,
LL | | };
| |_____^ help: replace with: `(Ok(1) as Result<i32, &str>).unwrap_or(42)`

error: this pattern reimplements `Option::unwrap_or`
--> $DIR/manual_unwrap_or.rs:112:5
|
LL | / match s.method() {
LL | | Some(i) => i,
LL | | None => 42,
LL | | };
| |_____^ help: replace with: `s.method().unwrap_or(42)`

error: this pattern reimplements `Result::unwrap_or`
--> $DIR/manual_unwrap_or.rs:105:5
--> $DIR/manual_unwrap_or.rs:118:5
|
LL | / match Ok::<i32, &str>(1) {
LL | | Err(_) => 42,
Expand All @@ -94,7 +103,7 @@ LL | | };
| |_____^ help: replace with: `Ok::<i32, &str>(1).unwrap_or(42)`

error: this pattern reimplements `Result::unwrap_or`
--> $DIR/manual_unwrap_or.rs:111:5
--> $DIR/manual_unwrap_or.rs:124:5
|
LL | / match Ok::<i32, &str>(1) {
LL | | Ok(i) => i,
Expand All @@ -103,7 +112,7 @@ LL | | };
| |_____^ help: replace with: `Ok::<i32, &str>(1).unwrap_or(1 + 42)`

error: this pattern reimplements `Result::unwrap_or`
--> $DIR/manual_unwrap_or.rs:118:5
--> $DIR/manual_unwrap_or.rs:131:5
|
LL | / match Ok::<i32, &str>(1) {
LL | | Ok(i) => i,
Expand All @@ -124,13 +133,13 @@ LL | });
|

error: this pattern reimplements `Result::unwrap_or`
--> $DIR/manual_unwrap_or.rs:128:5
--> $DIR/manual_unwrap_or.rs:141:5
|
LL | / match Ok::<&str, &str>("Bob") {
LL | | Ok(i) => i,
LL | | Err(_) => "Alice",
LL | | };
| |_____^ help: replace with: `Ok::<&str, &str>("Bob").unwrap_or("Alice")`

error: aborting due to 12 previous errors
error: aborting due to 13 previous errors

0 comments on commit 0d21ae0

Please sign in to comment.