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};
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,
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);
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,
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,
| |_____^ 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,
| |_____^ 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,
|
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 | | };
| |_____^ help: replace with: `Ok::<&str, &str>("Bob").unwrap_or("Alice")`
-error: aborting due to 12 previous errors
+error: aborting due to 13 previous errors