| //@aux-build:option_helpers.rs |
| |
| #![warn(clippy::map_unwrap_or)] |
| |
| #[macro_use] |
| extern crate option_helpers; |
| |
| use std::collections::HashMap; |
| |
| #[rustfmt::skip] |
| fn option_methods() { |
| let opt = Some(1); |
| |
| // Check for `option.map(_).unwrap_or_else(_)` use. |
| // single line case |
| let _ = opt.map_or_else(|| 0, |x| x + 1); |
| |
| // Macro case. |
| // Should not lint. |
| let _ = opt_map!(opt, |x| x + 1).unwrap_or_else(|| 0); |
| |
| // Issue #4144 |
| { |
| let mut frequencies = HashMap::new(); |
| let word = "foo"; |
| |
| frequencies |
| .get_mut(word) |
| .map(|count| { |
| *count += 1; |
| }) |
| .unwrap_or_else(|| { |
| frequencies.insert(word.to_owned(), 1); |
| }); |
| } |
| } |
| |
| #[rustfmt::skip] |
| fn result_methods() { |
| let res: Result<i32, ()> = Ok(1); |
| |
| // Check for `result.map(_).unwrap_or_else(_)` use. |
| // single line case |
| let _ = res.map_or_else(|_e| 0, |x| x + 1); |
| |
| // macro case |
| let _ = opt_map!(res, |x| x + 1).unwrap_or_else(|_e| 0); // should not lint |
| } |
| |
| fn main() {} |
| |
| fn issue15714() { |
| let o: Option<i32> = Some(3); |
| let r: Result<i32, ()> = Ok(3); |
| println!("{}", o.map_or(3, |y| y + 1)); |
| //~^ map_unwrap_or |
| println!("{}", o.map_or_else(|| 3, |y| y + 1)); |
| //~^ map_unwrap_or |
| println!("{}", r.map_or(3, |y| y + 1)); |
| //~^ map_unwrap_or |
| println!("{}", r.map_or_else(|()| 3, |y| y + 1)); |
| //~^ map_unwrap_or |
| |
| println!("{}", r.is_ok_and(|y| y == 1)); |
| //~^ map_unwrap_or |
| } |
| |
| fn issue15713() { |
| let x = &Some(3); |
| println!("{}", x.map_or(3, |y| y + 1)); |
| //~^ map_unwrap_or |
| |
| let x: &Result<i32, ()> = &Ok(3); |
| println!("{}", x.map_or(3, |y| y + 1)); |
| //~^ map_unwrap_or |
| |
| let x = &Some(3); |
| println!("{}", x.map_or_else(|| 3, |y| y + 1)); |
| //~^ map_unwrap_or |
| |
| let x: &Result<i32, ()> = &Ok(3); |
| println!("{}", x.map_or_else(|_| 3, |y| y + 1)); |
| //~^ map_unwrap_or |
| } |
| |
| // Support `map(_).unwrap_or_default()` pattern |
| mod pr17644 { |
| macro_rules! identity { |
| // Inner bracket is necessary to detect macro expansion |
| ( $e:expr ) => {{ $e }}; |
| } |
| |
| #[clippy::msrv = "1.98"] |
| mod unwrap_or_default { |
| fn option(opt: Option<i32>) { |
| let _ = opt.map_or_default(|x| x * x); //~ map_unwrap_or |
| let _ = opt.map_or_default(|x| vec![x]); //~ map_unwrap_or |
| let _ = identity!(opt.map_or_default(|x| x + 1)); //~ map_unwrap_or |
| let _ = identity!(opt.map(|x| x + 1)).unwrap_or_default(); |
| let _ = identity!(opt).map(|x| x + 1).unwrap_or_default(); |
| } |
| fn result(res: Result<i32, ()>) { |
| let _ = res.map_or_default(|x| x * x); //~ map_unwrap_or |
| let _ = res.map_or_default(|x| vec![x]); //~ map_unwrap_or |
| let _ = identity!(res.map_or_default(|x| x + 1)); //~ map_unwrap_or |
| let _ = identity!(res.map(|x| x + 1)).unwrap_or_default(); |
| let _ = identity!(res).map(|x| x + 1).unwrap_or_default(); |
| } |
| } |
| |
| #[clippy::msrv = "1.97"] |
| mod unwrap_or_default_before_msrv { |
| fn option(opt: Option<i32>) { |
| let _ = opt.map(|x| x * x).unwrap_or_default(); |
| let _ = opt.map(|x| vec![x]).unwrap_or_default(); |
| let _ = identity!(opt.map(|x| x + 1).unwrap_or_default()); |
| let _ = identity!(opt.map(|x| x + 1)).unwrap_or_default(); |
| let _ = identity!(opt).map(|x| x + 1).unwrap_or_default(); |
| } |
| fn result(res: Result<i32, ()>) { |
| let _ = res.map(|x| x * x).unwrap_or_default(); |
| let _ = res.map(|x| vec![x]).unwrap_or_default(); |
| let _ = identity!(res.map(|x| x + 1).unwrap_or_default()); |
| let _ = identity!(res.map(|x| x + 1)).unwrap_or_default(); |
| let _ = identity!(res).map(|x| x + 1).unwrap_or_default(); |
| } |
| } |
| } |