1- use clippy_utils:: diagnostics:: { span_lint , span_lint_and_sugg } ;
1+ use clippy_utils:: diagnostics:: span_lint_and_then ;
22use clippy_utils:: msrvs:: { self , Msrv } ;
33use clippy_utils:: res:: { MaybeDef , MaybeTypeckRes } ;
44use clippy_utils:: source:: snippet;
@@ -12,22 +12,24 @@ use super::FILTER_MAP_NEXT;
1212pub ( super ) fn check ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > , recv : & Expr < ' _ > , arg : & Expr < ' _ > , msrv : Msrv ) {
1313 if cx. ty_based_def ( expr) . opt_parent ( cx) . is_diag_item ( cx, sym:: Iterator ) && msrv. meets ( cx, msrvs:: ITERATOR_FIND_MAP )
1414 {
15- let msg = "called `filter_map(..).next()` on an `Iterator`. \
16- This is more succinctly expressed by calling `.find_map(..)` instead";
17- let filter_snippet = snippet ( cx, arg. span , ".." ) ;
18- if filter_snippet. lines ( ) . count ( ) <= 1 {
19- let iter_snippet = snippet ( cx, recv. span , ".." ) ;
20- span_lint_and_sugg (
21- cx,
22- FILTER_MAP_NEXT ,
23- expr. span ,
24- msg,
25- "try" ,
26- format ! ( "{iter_snippet}.find_map({filter_snippet})" ) ,
27- Applicability :: MachineApplicable ,
28- ) ;
29- } else {
30- span_lint ( cx, FILTER_MAP_NEXT , expr. span , msg) ;
31- }
15+ span_lint_and_then (
16+ cx,
17+ FILTER_MAP_NEXT ,
18+ expr. span ,
19+ "called `filter_map(..).next()` on an `Iterator`. \
20+ This is more succinctly expressed by calling `.find_map(..)` instead",
21+ |diag| {
22+ let filter_snippet = snippet ( cx, arg. span , ".." ) ;
23+ if filter_snippet. lines ( ) . count ( ) <= 1 {
24+ let iter_snippet = snippet ( cx, recv. span , ".." ) ;
25+ diag. span_suggestion (
26+ expr. span ,
27+ "try" ,
28+ format ! ( "{iter_snippet}.find_map({filter_snippet})" ) ,
29+ Applicability :: MachineApplicable ,
30+ ) ;
31+ }
32+ } ,
33+ ) ;
3234 }
3335}
0 commit comments