@@ -16,12 +16,13 @@ use crate::rustc::{declare_tool_lint, lint_array};
1616use  crate :: rustc_errors:: Applicability ; 
1717use  crate :: syntax:: ast; 
1818use  crate :: syntax:: source_map:: { BytePos ,  Span } ; 
19+ use  crate :: syntax:: symbol:: LocalInternedString ; 
1920use  crate :: utils:: paths; 
2021use  crate :: utils:: sugg; 
2122use  crate :: utils:: { 
2223    get_arg_name,  get_trait_def_id,  implements_trait,  in_macro,  is_copy,  is_expn_of,  is_self,  is_self_ty, 
2324    iter_input_pats,  last_path_segment,  match_def_path,  match_path,  match_qpath,  match_trait_method,  match_type, 
24-     match_var,  method_chain_args,  remove_blocks,  return_ty,  same_tys,  single_segment_path,  snippet,  snippet_with_macro_callsite,  span_lint, 
25+     match_var,  method_calls ,   method_chain_args,  remove_blocks,  return_ty,  same_tys,  single_segment_path,  snippet,  snippet_with_macro_callsite,  span_lint, 
2526    span_lint_and_sugg,  span_lint_and_then,  span_note_and_lint,  walk_ptrs_ty,  walk_ptrs_ty_depth,  SpanlessEq , 
2627} ; 
2728use  if_chain:: if_chain; 
@@ -790,63 +791,42 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass {
790791            return ; 
791792        } 
792793
794+         let  ( method_names,  arg_lists)  = method_calls ( expr,  2 ) ; 
795+         let  method_names:  Vec < LocalInternedString >  = method_names. iter ( ) . map ( |s| s. as_str ( ) ) . collect ( ) ; 
796+         let  method_names:  Vec < & str >  = method_names. iter ( ) . map ( |s| s. as_ref ( ) ) . collect ( ) ; 
797+ 
798+         match  method_names. as_slice ( )  { 
799+             [ "unwrap" ,  "get" ]  => lint_get_unwrap ( cx,  expr,  arg_lists[ 1 ] ,  false ) , 
800+             [ "unwrap" ,  "get_mut" ]  => lint_get_unwrap ( cx,  expr,  arg_lists[ 1 ] ,  true ) , 
801+             [ "unwrap" ,  ..]  => lint_unwrap ( cx,  expr,  arg_lists[ 0 ] ) , 
802+             [ "expect" ,  "ok" ]  => lint_ok_expect ( cx,  expr,  arg_lists[ 1 ] ) , 
803+             [ "unwrap_or" ,  "map" ]  => lint_map_unwrap_or ( cx,  expr,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
804+             [ "unwrap_or_else" ,  "map" ]  => lint_map_unwrap_or_else ( cx,  expr,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
805+             [ "map_or" ,  ..]  => lint_map_or_none ( cx,  expr,  arg_lists[ 0 ] ) , 
806+             [ "next" ,  "filter" ]  => lint_filter_next ( cx,  expr,  arg_lists[ 1 ] ) , 
807+             [ "map" ,  "filter" ]  => lint_filter_map ( cx,  expr,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
808+             [ "map" ,  "filter_map" ]  => lint_filter_map_map ( cx,  expr,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
809+             [ "flat_map" ,  "filter" ]  => lint_filter_flat_map ( cx,  expr,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
810+             [ "flat_map" ,  "filter_map" ]  => lint_filter_map_flat_map ( cx,  expr,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
811+             [ "flatten" ,  "map" ]  => lint_map_flatten ( cx,  expr,  arg_lists[ 1 ] ) , 
812+             [ "is_some" ,  "find" ]  => lint_search_is_some ( cx,  expr,  "find" ,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
813+             [ "is_some" ,  "position" ]  => lint_search_is_some ( cx,  expr,  "position" ,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
814+             [ "is_some" ,  "rposition" ]  => lint_search_is_some ( cx,  expr,  "rposition" ,  arg_lists[ 1 ] ,  arg_lists[ 0 ] ) , 
815+             [ "extend" ,  ..]  => lint_extend ( cx,  expr,  arg_lists[ 0 ] ) , 
816+             [ "as_ptr" ,  "unwrap" ]  => lint_cstring_as_ptr ( cx,  expr,  & arg_lists[ 1 ] [ 0 ] ,  & arg_lists[ 0 ] [ 0 ] ) , 
817+             [ "nth" ,  "iter" ]  => lint_iter_nth ( cx,  expr,  arg_lists[ 1 ] ,  false ) , 
818+             [ "nth" ,  "iter_mut" ]  => lint_iter_nth ( cx,  expr,  arg_lists[ 1 ] ,  true ) , 
819+             [ "next" ,  "skip" ]  => lint_iter_skip_next ( cx,  expr) , 
820+             [ "collect" ,  "cloned" ]  => lint_iter_cloned_collect ( cx,  expr,  arg_lists[ 1 ] ) , 
821+             [ "as_ref" ,  ..]  => lint_asref ( cx,  expr,  "as_ref" ,  arg_lists[ 0 ] ) , 
822+             [ "as_mut" ,  ..]  => lint_asref ( cx,  expr,  "as_mut" ,  arg_lists[ 0 ] ) , 
823+             [ "fold" ,  ..]  => lint_unnecessary_fold ( cx,  expr,  arg_lists[ 0 ] ) , 
824+             [ "filter_map" ,  ..]  => unnecessary_filter_map:: lint ( cx,  expr,  arg_lists[ 0 ] ) , 
825+             _ => { } 
826+         } 
827+ 
793828        match  expr. node  { 
794829            hir:: ExprKind :: MethodCall ( ref  method_call,  ref  method_span,  ref  args)  => { 
795-                 // Chain calls 
796-                 // GET_UNWRAP needs to be checked before general `UNWRAP` lints 
797-                 if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "get" ,  "unwrap" ] )  { 
798-                     lint_get_unwrap ( cx,  expr,  arglists[ 0 ] ,  false ) ; 
799-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "get_mut" ,  "unwrap" ] )  { 
800-                     lint_get_unwrap ( cx,  expr,  arglists[ 0 ] ,  true ) ; 
801-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "unwrap" ] )  { 
802-                     lint_unwrap ( cx,  expr,  arglists[ 0 ] ) ; 
803-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "ok" ,  "expect" ] )  { 
804-                     lint_ok_expect ( cx,  expr,  arglists[ 0 ] ) ; 
805-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "map" ,  "unwrap_or" ] )  { 
806-                     lint_map_unwrap_or ( cx,  expr,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
807-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "map" ,  "unwrap_or_else" ] )  { 
808-                     lint_map_unwrap_or_else ( cx,  expr,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
809-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "map_or" ] )  { 
810-                     lint_map_or_none ( cx,  expr,  arglists[ 0 ] ) ; 
811-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "filter" ,  "next" ] )  { 
812-                     lint_filter_next ( cx,  expr,  arglists[ 0 ] ) ; 
813-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "filter" ,  "map" ] )  { 
814-                     lint_filter_map ( cx,  expr,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
815-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "filter_map" ,  "map" ] )  { 
816-                     lint_filter_map_map ( cx,  expr,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
817-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "filter" ,  "flat_map" ] )  { 
818-                     lint_filter_flat_map ( cx,  expr,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
819-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "filter_map" ,  "flat_map" ] )  { 
820-                     lint_filter_map_flat_map ( cx,  expr,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
821-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "map" ,  "flatten" ] )  { 
822-                     lint_map_flatten ( cx,  expr,  arglists[ 0 ] ) ; 
823-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "find" ,  "is_some" ] )  { 
824-                     lint_search_is_some ( cx,  expr,  "find" ,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
825-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "position" ,  "is_some" ] )  { 
826-                     lint_search_is_some ( cx,  expr,  "position" ,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
827-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "rposition" ,  "is_some" ] )  { 
828-                     lint_search_is_some ( cx,  expr,  "rposition" ,  arglists[ 0 ] ,  arglists[ 1 ] ) ; 
829-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "extend" ] )  { 
830-                     lint_extend ( cx,  expr,  arglists[ 0 ] ) ; 
831-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "unwrap" ,  "as_ptr" ] )  { 
832-                     lint_cstring_as_ptr ( cx,  expr,  & arglists[ 0 ] [ 0 ] ,  & arglists[ 1 ] [ 0 ] ) ; 
833-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "iter" ,  "nth" ] )  { 
834-                     lint_iter_nth ( cx,  expr,  arglists[ 0 ] ,  false ) ; 
835-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "iter_mut" ,  "nth" ] )  { 
836-                     lint_iter_nth ( cx,  expr,  arglists[ 0 ] ,  true ) ; 
837-                 }  else  if  method_chain_args ( expr,  & [ "skip" ,  "next" ] ) . is_some ( )  { 
838-                     lint_iter_skip_next ( cx,  expr) ; 
839-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "cloned" ,  "collect" ] )  { 
840-                     lint_iter_cloned_collect ( cx,  expr,  arglists[ 0 ] ) ; 
841-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "as_ref" ] )  { 
842-                     lint_asref ( cx,  expr,  "as_ref" ,  arglists[ 0 ] ) ; 
843-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "as_mut" ] )  { 
844-                     lint_asref ( cx,  expr,  "as_mut" ,  arglists[ 0 ] ) ; 
845-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "fold" ] )  { 
846-                     lint_unnecessary_fold ( cx,  expr,  arglists[ 0 ] ) ; 
847-                 }  else  if  let  Some ( arglists)  = method_chain_args ( expr,  & [ "filter_map" ] )  { 
848-                     unnecessary_filter_map:: lint ( cx,  expr,  arglists[ 0 ] ) ; 
849-                 } 
850830
851831                lint_or_fun_call ( cx,  expr,  * method_span,  & method_call. ident . as_str ( ) ,  args) ; 
852832                lint_expect_fun_call ( cx,  expr,  * method_span,  & method_call. ident . as_str ( ) ,  args) ; 
0 commit comments