add manual_ok_or lint

This commit is contained in:
Tim Nielens 2020-10-27 01:47:40 +01:00
parent afbac8906e
commit 111b9023da
7 changed files with 234 additions and 0 deletions

View file

@ -0,0 +1,40 @@
// run-rustfix
#![warn(clippy::manual_ok_or)]
#![allow(clippy::blacklisted_name)]
#![allow(clippy::redundant_closure)]
#![allow(dead_code)]
#![allow(unused_must_use)]
fn main() {
// basic case
let foo: Option<i32> = None;
foo.ok_or("error");
// eta expansion case
foo.ok_or("error");
// turbo fish syntax
None::<i32>.ok_or("error");
// multiline case
#[rustfmt::skip]
foo.ok_or(&format!(
"{}{}{}{}{}{}{}",
"Alice", "Bob", "Sarah", "Marc", "Sandra", "Eric", "Jenifer"));
// not applicable, closure isn't direct `Ok` wrapping
foo.map_or(Err("error"), |v| Ok(v + 1));
// not applicable, or side isn't `Result::Err`
foo.map_or(Ok::<i32, &str>(1), |v| Ok(v));
// not applicatble, expr is not a `Result` value
foo.map_or(42, |v| v);
// TODO patterns not covered yet
match foo {
Some(v) => Ok(v),
None => Err("error"),
};
foo.map_or_else(|| Err("error"), |v| Ok(v));
}

44
tests/ui/manual_ok_or.rs Normal file
View file

@ -0,0 +1,44 @@
// run-rustfix
#![warn(clippy::manual_ok_or)]
#![allow(clippy::blacklisted_name)]
#![allow(clippy::redundant_closure)]
#![allow(dead_code)]
#![allow(unused_must_use)]
fn main() {
// basic case
let foo: Option<i32> = None;
foo.map_or(Err("error"), |v| Ok(v));
// eta expansion case
foo.map_or(Err("error"), Ok);
// turbo fish syntax
None::<i32>.map_or(Err("error"), |v| Ok(v));
// multiline case
#[rustfmt::skip]
foo.map_or(Err::<i32, &str>(
&format!(
"{}{}{}{}{}{}{}",
"Alice", "Bob", "Sarah", "Marc", "Sandra", "Eric", "Jenifer")
),
|v| Ok(v),
);
// not applicable, closure isn't direct `Ok` wrapping
foo.map_or(Err("error"), |v| Ok(v + 1));
// not applicable, or side isn't `Result::Err`
foo.map_or(Ok::<i32, &str>(1), |v| Ok(v));
// not applicatble, expr is not a `Result` value
foo.map_or(42, |v| v);
// TODO patterns not covered yet
match foo {
Some(v) => Ok(v),
None => Err("error"),
};
foo.map_or_else(|| Err("error"), |v| Ok(v));
}

View file

@ -0,0 +1,41 @@
error: this pattern reimplements `Option::ok_or`
--> $DIR/manual_ok_or.rs:11:5
|
LL | foo.map_or(Err("error"), |v| Ok(v));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `foo.ok_or("error")`
|
= note: `-D clippy::manual-ok-or` implied by `-D warnings`
error: this pattern reimplements `Option::ok_or`
--> $DIR/manual_ok_or.rs:14:5
|
LL | foo.map_or(Err("error"), Ok);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `foo.ok_or("error")`
error: this pattern reimplements `Option::ok_or`
--> $DIR/manual_ok_or.rs:17:5
|
LL | None::<i32>.map_or(Err("error"), |v| Ok(v));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `None::<i32>.ok_or("error")`
error: this pattern reimplements `Option::ok_or`
--> $DIR/manual_ok_or.rs:21:5
|
LL | / foo.map_or(Err::<i32, &str>(
LL | | &format!(
LL | | "{}{}{}{}{}{}{}",
LL | | "Alice", "Bob", "Sarah", "Marc", "Sandra", "Eric", "Jenifer")
LL | | ),
LL | | |v| Ok(v),
LL | | );
| |_____^
|
help: replace with
|
LL | foo.ok_or(&format!(
LL | "{}{}{}{}{}{}{}",
LL | "Alice", "Bob", "Sarah", "Marc", "Sandra", "Eric", "Jenifer"));
|
error: aborting due to 4 previous errors