]> git.lizzy.rs Git - rust.git/blobdiff - tests/ui/unnecessary_lazy_eval.fixed
Extend unnecessary_lazy_eval to cover `bool::then` -> `bool::then_some`
[rust.git] / tests / ui / unnecessary_lazy_eval.fixed
index fcfa6dfe12d5f4092c07339ffe319ab086a0b8c2..eed817968832193aa2d7588043480134c3e04d13 100644 (file)
@@ -1,17 +1,18 @@
 // run-rustfix
-#![warn(clippy::unnecessary_lazy_evaluation)]
+#![warn(clippy::unnecessary_lazy_evaluations)]
 #![allow(clippy::redundant_closure)]
 #![allow(clippy::bind_instead_of_map)]
+#![allow(clippy::map_identity)]
 
-struct Deep(Option<u32>);
+struct Deep(Option<usize>);
 
 #[derive(Copy, Clone)]
 struct SomeStruct {
-    some_field: u32,
+    some_field: usize,
 }
 
 impl SomeStruct {
-    fn return_some_field(&self) -> u32 {
+    fn return_some_field(&self) -> usize {
         self.some_field
     }
 }
@@ -22,27 +23,35 @@ fn some_call<T: Default>() -> T {
 
 fn main() {
     let astronomers_pi = 10;
+    let ext_arr: [usize; 1] = [2];
     let ext_str = SomeStruct { some_field: 10 };
 
-    // Should lint - Option
     let mut opt = Some(42);
     let ext_opt = Some(42);
+    let nested_opt = Some(Some(42));
+    let nested_tuple_opt = Some(Some((42, 43)));
+    let cond = true;
+
+    // Should lint - Option
     let _ = opt.unwrap_or(2);
     let _ = opt.unwrap_or(astronomers_pi);
     let _ = opt.unwrap_or(ext_str.some_field);
+    let _ = opt.unwrap_or_else(|| ext_arr[0]);
     let _ = opt.and(ext_opt);
     let _ = opt.or(ext_opt);
     let _ = opt.or(None);
     let _ = opt.get_or_insert(2);
     let _ = opt.ok_or(2);
+    let _ = nested_tuple_opt.unwrap_or(Some((1, 2)));
+    let _ = cond.then_some(astronomers_pi);
 
     // Cases when unwrap is not called on a simple variable
     let _ = Some(10).unwrap_or(2);
     let _ = Some(10).and(ext_opt);
-    let _: Option<u32> = None.or(ext_opt);
+    let _: Option<usize> = None.or(ext_opt);
     let _ = None.get_or_insert(2);
-    let _: Result<u32, u32> = None.ok_or(2);
-    let _: Option<u32> = None.or(None);
+    let _: Result<usize, usize> = None.ok_or(2);
+    let _: Option<usize> = None.or(None);
 
     let mut deep = Deep(Some(42));
     let _ = deep.0.unwrap_or(2);
@@ -53,22 +62,29 @@ fn main() {
 
     // Should not lint - Option
     let _ = opt.unwrap_or_else(|| ext_str.return_some_field());
+    let _ = nested_opt.unwrap_or_else(|| Some(some_call()));
+    let _ = nested_tuple_opt.unwrap_or_else(|| Some((some_call(), some_call())));
     let _ = opt.or_else(some_call);
     let _ = opt.or_else(|| some_call());
-    let _: Result<u32, u32> = opt.ok_or_else(|| some_call());
-    let _: Result<u32, u32> = opt.ok_or_else(some_call);
+    let _: Result<usize, usize> = opt.ok_or_else(|| some_call());
+    let _: Result<usize, usize> = opt.ok_or_else(some_call);
     let _ = deep.0.get_or_insert_with(|| some_call());
     let _ = deep.0.or_else(some_call);
     let _ = deep.0.or_else(|| some_call());
+    let _ = opt.ok_or_else(|| ext_arr[0]);
 
-    // These are handled by bind_instead_of_map
-    let _: Option<u32> = None.or_else(|| Some(3));
-    let _ = deep.0.or_else(|| Some(3));
-    let _ = opt.or_else(|| Some(3));
+    // should not lint, bind_instead_of_map takes priority
+    let _ = Some(10).and_then(|idx| Some(ext_arr[idx]));
+    let _ = Some(10).and_then(|idx| Some(idx));
+
+    // should lint, bind_instead_of_map doesn't apply
+    let _: Option<usize> = None.or(Some(3));
+    let _ = deep.0.or(Some(3));
+    let _ = opt.or(Some(3));
 
     // Should lint - Result
-    let res: Result<u32, u32> = Err(5);
-    let res2: Result<u32, SomeStruct> = Err(SomeStruct { some_field: 5 });
+    let res: Result<usize, usize> = Err(5);
+    let res2: Result<usize, SomeStruct> = Err(SomeStruct { some_field: 5 });
 
     let _ = res2.unwrap_or(2);
     let _ = res2.unwrap_or(astronomers_pi);
@@ -76,30 +92,41 @@ fn main() {
 
     // Should not lint - Result
     let _ = res.unwrap_or_else(|err| err);
+    let _ = res.unwrap_or_else(|err| ext_arr[err]);
     let _ = res2.unwrap_or_else(|err| err.some_field);
     let _ = res2.unwrap_or_else(|err| err.return_some_field());
     let _ = res2.unwrap_or_else(|_| ext_str.return_some_field());
 
-    let _: Result<u32, u32> = res.and_then(|x| Ok(x));
-    let _: Result<u32, u32> = res.and_then(|x| Err(x));
-
-    let _: Result<u32, u32> = res.or_else(|err| Ok(err));
-    let _: Result<u32, u32> = res.or_else(|err| Err(err));
-
-    // These are handled by bind_instead_of_map
-    let _: Result<u32, u32> = res.and_then(|_| Ok(2));
-    let _: Result<u32, u32> = res.and_then(|_| Ok(astronomers_pi));
-    let _: Result<u32, u32> = res.and_then(|_| Ok(ext_str.some_field));
-
-    let _: Result<u32, u32> = res.and_then(|_| Err(2));
-    let _: Result<u32, u32> = res.and_then(|_| Err(astronomers_pi));
-    let _: Result<u32, u32> = res.and_then(|_| Err(ext_str.some_field));
-
-    let _: Result<u32, u32> = res.or_else(|_| Ok(2));
-    let _: Result<u32, u32> = res.or_else(|_| Ok(astronomers_pi));
-    let _: Result<u32, u32> = res.or_else(|_| Ok(ext_str.some_field));
-
-    let _: Result<u32, u32> = res.or_else(|_| Err(2));
-    let _: Result<u32, u32> = res.or_else(|_| Err(astronomers_pi));
-    let _: Result<u32, u32> = res.or_else(|_| Err(ext_str.some_field));
+    // should not lint, bind_instead_of_map takes priority
+    let _: Result<usize, usize> = res.and_then(|x| Ok(x));
+    let _: Result<usize, usize> = res.or_else(|err| Err(err));
+
+    let _: Result<usize, usize> = res.and_then(|_| Ok(2));
+    let _: Result<usize, usize> = res.and_then(|_| Ok(astronomers_pi));
+    let _: Result<usize, usize> = res.and_then(|_| Ok(ext_str.some_field));
+
+    let _: Result<usize, usize> = res.or_else(|_| Err(2));
+    let _: Result<usize, usize> = res.or_else(|_| Err(astronomers_pi));
+    let _: Result<usize, usize> = res.or_else(|_| Err(ext_str.some_field));
+
+    // should lint, bind_instead_of_map doesn't apply
+    let _: Result<usize, usize> = res.and(Err(2));
+    let _: Result<usize, usize> = res.and(Err(astronomers_pi));
+    let _: Result<usize, usize> = res.and(Err(ext_str.some_field));
+
+    let _: Result<usize, usize> = res.or(Ok(2));
+    let _: Result<usize, usize> = res.or(Ok(astronomers_pi));
+    let _: Result<usize, usize> = res.or(Ok(ext_str.some_field));
+    let _: Result<usize, usize> = res.
+        // some lines
+        // some lines
+        // some lines
+        // some lines
+        // some lines
+        // some lines
+        or(Ok(ext_str.some_field));
+
+    // neither bind_instead_of_map nor unnecessary_lazy_eval applies here
+    let _: Result<usize, usize> = res.and_then(|x| Err(x));
+    let _: Result<usize, usize> = res.or_else(|err| Ok(err));
 }