refactor: Add some methods

This commit is contained in:
kyoto7250 2022-06-04 16:55:33 +09:00
parent 007fae10ed
commit 990f8bf5a6
7 changed files with 185 additions and 9 deletions

View File

@ -6,7 +6,7 @@ use if_chain::if_chain;
use rustc_errors::Applicability;
use rustc_hir as hir;
use rustc_hir::def::Res;
use rustc_hir::{Expr, ExprKind, PatKind, QPath, UnOp};
use rustc_hir::{Expr, ExprKind, PatKind, PathSegment, QPath, UnOp};
use rustc_lint::LateContext;
use rustc_span::source_map::Span;
use rustc_span::symbol::{sym, Symbol};
@ -157,8 +157,8 @@ pub(super) fn check<'tcx>(
};
if match map_arg.kind {
ExprKind::MethodCall(clone, [original_arg], _) => {
clone.ident.name == sym::clone
ExprKind::MethodCall(method, [original_arg], _) => {
acceptable_methods(method)
&& SpanlessEq::new(cx).expr_fallback(eq_fallback).eq_expr(filter_arg, original_arg)
},
_ => SpanlessEq::new(cx).expr_fallback(eq_fallback).eq_expr(filter_arg, map_arg)
@ -179,3 +179,16 @@ pub(super) fn check<'tcx>(
}
}
}
fn acceptable_methods(method: &PathSegment<'_>) -> bool {
let methods: [Symbol; 6] = [
sym::clone,
sym::as_ref,
sym!(as_deref),
sym!(as_mut),
sym!(as_deref_mut),
sym!(to_owned),
];
methods.contains(&method.ident.name)
}

View File

@ -52,8 +52,28 @@ fn issue_8920() {
.iter()
.filter_map(|f| f.field.clone());
let vec = vec![ResultFoo {
let mut vec = vec![ResultFoo {
field: Ok(String::from("str")),
}];
let _ = vec.iter().filter_map(|f| f.field.clone().ok());
let _ = vec
.iter()
.filter_map(|f| f.field.as_ref().ok());
let _ = vec
.iter()
.filter_map(|f| f.field.as_deref().ok());
let _ = vec
.iter_mut()
.filter_map(|f| f.field.as_mut().ok());
let _ = vec
.iter_mut()
.filter_map(|f| f.field.as_deref_mut().ok());
let _ = vec
.iter()
.filter_map(|f| f.field.to_owned().ok());
}

View File

@ -53,8 +53,33 @@ fn issue_8920() {
.filter(|f| f.field.is_some())
.map(|f| f.field.clone().unwrap());
let vec = vec![ResultFoo {
let mut vec = vec![ResultFoo {
field: Ok(String::from("str")),
}];
let _ = vec.iter().filter(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
let _ = vec
.iter()
.filter(|f| f.field.is_ok())
.map(|f| f.field.as_ref().unwrap());
let _ = vec
.iter()
.filter(|f| f.field.is_ok())
.map(|f| f.field.as_deref().unwrap());
let _ = vec
.iter_mut()
.filter(|f| f.field.is_ok())
.map(|f| f.field.as_mut().unwrap());
let _ = vec
.iter_mut()
.filter(|f| f.field.is_ok())
.map(|f| f.field.as_deref_mut().unwrap());
let _ = vec
.iter()
.filter(|f| f.field.is_ok())
.map(|f| f.field.to_owned().unwrap());
}

View File

@ -32,5 +32,45 @@ error: `filter(..).map(..)` can be simplified as `filter_map(..)`
LL | let _ = vec.iter().filter(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `filter_map(|f| f.field.clone().ok())`
error: aborting due to 5 previous errors
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
--> $DIR/manual_filter_map.rs:63:10
|
LL | .filter(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.as_ref().unwrap());
| |___________________________________________^ help: try: `filter_map(|f| f.field.as_ref().ok())`
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
--> $DIR/manual_filter_map.rs:68:10
|
LL | .filter(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.as_deref().unwrap());
| |_____________________________________________^ help: try: `filter_map(|f| f.field.as_deref().ok())`
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
--> $DIR/manual_filter_map.rs:73:10
|
LL | .filter(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.as_mut().unwrap());
| |___________________________________________^ help: try: `filter_map(|f| f.field.as_mut().ok())`
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
--> $DIR/manual_filter_map.rs:78:10
|
LL | .filter(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.as_deref_mut().unwrap());
| |_________________________________________________^ help: try: `filter_map(|f| f.field.as_deref_mut().ok())`
error: `filter(..).map(..)` can be simplified as `filter_map(..)`
--> $DIR/manual_filter_map.rs:83:10
|
LL | .filter(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.to_owned().unwrap());
| |_____________________________________________^ help: try: `filter_map(|f| f.field.to_owned().ok())`
error: aborting due to 10 previous errors

View File

@ -50,8 +50,26 @@ fn issue_8920() {
}];
let _ = vec.iter().find_map(|f| f.field.clone());
let vec = vec![ResultFoo {
let mut vec = vec![ResultFoo {
field: Ok(String::from("str")),
}];
let _ = vec.iter().find_map(|f| f.field.clone().ok());
let _ = vec.iter().find_map(|f| f.field.as_ref().ok());
let _ = vec
.iter()
.find_map(|f| f.field.as_deref().ok());
let _ = vec
.iter_mut()
.find_map(|f| f.field.as_mut().ok());
let _ = vec
.iter_mut()
.find_map(|f| f.field.as_deref_mut().ok());
let _ = vec
.iter()
.find_map(|f| f.field.to_owned().ok());
}

View File

@ -50,8 +50,30 @@ fn issue_8920() {
}];
let _ = vec.iter().find(|f| f.field.is_some()).map(|f| f.field.clone().unwrap());
let vec = vec![ResultFoo {
let mut vec = vec![ResultFoo {
field: Ok(String::from("str")),
}];
let _ = vec.iter().find(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
let _ = vec.iter().find(|f| f.field.is_ok()).map(|f| f.field.as_ref().unwrap());
let _ = vec
.iter()
.find(|f| f.field.is_ok())
.map(|f| f.field.as_deref().unwrap());
let _ = vec
.iter_mut()
.find(|f| f.field.is_ok())
.map(|f| f.field.as_mut().unwrap());
let _ = vec
.iter_mut()
.find(|f| f.field.is_ok())
.map(|f| f.field.as_deref_mut().unwrap());
let _ = vec
.iter()
.find(|f| f.field.is_ok())
.map(|f| f.field.to_owned().unwrap());
}

View File

@ -30,5 +30,43 @@ error: `find(..).map(..)` can be simplified as `find_map(..)`
LL | let _ = vec.iter().find(|f| f.field.is_ok()).map(|f| f.field.clone().unwrap());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `find_map(|f| f.field.clone().ok())`
error: aborting due to 5 previous errors
error: `find(..).map(..)` can be simplified as `find_map(..)`
--> $DIR/manual_find_map.rs:58:24
|
LL | let _ = vec.iter().find(|f| f.field.is_ok()).map(|f| f.field.as_ref().unwrap());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `find_map(|f| f.field.as_ref().ok())`
error: `find(..).map(..)` can be simplified as `find_map(..)`
--> $DIR/manual_find_map.rs:62:10
|
LL | .find(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.as_deref().unwrap());
| |_____________________________________________^ help: try: `find_map(|f| f.field.as_deref().ok())`
error: `find(..).map(..)` can be simplified as `find_map(..)`
--> $DIR/manual_find_map.rs:67:10
|
LL | .find(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.as_mut().unwrap());
| |___________________________________________^ help: try: `find_map(|f| f.field.as_mut().ok())`
error: `find(..).map(..)` can be simplified as `find_map(..)`
--> $DIR/manual_find_map.rs:72:10
|
LL | .find(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.as_deref_mut().unwrap());
| |_________________________________________________^ help: try: `find_map(|f| f.field.as_deref_mut().ok())`
error: `find(..).map(..)` can be simplified as `find_map(..)`
--> $DIR/manual_find_map.rs:77:10
|
LL | .find(|f| f.field.is_ok())
| __________^
LL | | .map(|f| f.field.to_owned().unwrap());
| |_____________________________________________^ help: try: `find_map(|f| f.field.to_owned().ok())`
error: aborting due to 10 previous errors