@@ -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;
@@ -783,63 +784,42 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass {
783784 return ;
784785 }
785786
787+ let ( method_names, arg_lists) = method_calls ( expr, 2 ) ;
788+ let method_names: Vec < LocalInternedString > = method_names. iter ( ) . map ( |s| s. as_str ( ) ) . collect ( ) ;
789+ let mut method_names = method_names. iter ( ) . map ( |s| s. as_ref ( ) ) . chain ( iter:: repeat ( "" ) ) ;
790+
791+ match [ method_names. next ( ) . unwrap ( ) , method_names. next ( ) . unwrap ( ) ] {
792+ [ "unwrap" , "get" ] => lint_get_unwrap ( cx, expr, arg_lists[ 1 ] , false ) ,
793+ [ "unwrap" , "get_mut" ] => lint_get_unwrap ( cx, expr, arg_lists[ 1 ] , true ) ,
794+ [ "unwrap" , _] => lint_unwrap ( cx, expr, arg_lists[ 0 ] ) ,
795+ [ "expect" , "ok" ] => lint_ok_expect ( cx, expr, arg_lists[ 1 ] ) ,
796+ [ "unwrap_or" , "map" ] => lint_map_unwrap_or ( cx, expr, arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
797+ [ "unwrap_or_else" , "map" ] => lint_map_unwrap_or_else ( cx, expr, arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
798+ [ "map_or" , _] => lint_map_or_none ( cx, expr, arg_lists[ 0 ] ) ,
799+ [ "next" , "filter" ] => lint_filter_next ( cx, expr, arg_lists[ 1 ] ) ,
800+ [ "map" , "filter" ] => lint_filter_map ( cx, expr, arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
801+ [ "map" , "filter_map" ] => lint_filter_map_map ( cx, expr, arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
802+ [ "flat_map" , "filter" ] => lint_filter_flat_map ( cx, expr, arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
803+ [ "flat_map" , "filter_map" ] => lint_filter_map_flat_map ( cx, expr, arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
804+ [ "flatten" , "map" ] => lint_map_flatten ( cx, expr, arg_lists[ 1 ] ) ,
805+ [ "is_some" , "find" ] => lint_search_is_some ( cx, expr, "find" , arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
806+ [ "is_some" , "position" ] => lint_search_is_some ( cx, expr, "position" , arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
807+ [ "is_some" , "rposition" ] => lint_search_is_some ( cx, expr, "rposition" , arg_lists[ 1 ] , arg_lists[ 0 ] ) ,
808+ [ "extend" , _] => lint_extend ( cx, expr, arg_lists[ 0 ] ) ,
809+ [ "as_ptr" , "unwrap" ] => lint_cstring_as_ptr ( cx, expr, & arg_lists[ 1 ] [ 0 ] , & arg_lists[ 0 ] [ 0 ] ) ,
810+ [ "nth" , "iter" ] => lint_iter_nth ( cx, expr, arg_lists[ 1 ] , false ) ,
811+ [ "nth" , "iter_mut" ] => lint_iter_nth ( cx, expr, arg_lists[ 1 ] , true ) ,
812+ [ "next" , "skip" ] => lint_iter_skip_next ( cx, expr) ,
813+ [ "collect" , "cloned" ] => lint_iter_cloned_collect ( cx, expr, arg_lists[ 1 ] ) ,
814+ [ "as_ref" , _] => lint_asref ( cx, expr, "as_ref" , arg_lists[ 0 ] ) ,
815+ [ "as_mut" , _] => lint_asref ( cx, expr, "as_mut" , arg_lists[ 0 ] ) ,
816+ [ "fold" , _] => lint_unnecessary_fold ( cx, expr, arg_lists[ 0 ] ) ,
817+ [ "filter_map" , _] => unnecessary_filter_map:: lint ( cx, expr, arg_lists[ 0 ] ) ,
818+ _ => { }
819+ }
820+
786821 match expr. node {
787822 hir:: ExprKind :: MethodCall ( ref method_call, ref method_span, ref args) => {
788- // Chain calls
789- // GET_UNWRAP needs to be checked before general `UNWRAP` lints
790- if let Some ( arglists) = method_chain_args ( expr, & [ "get" , "unwrap" ] ) {
791- lint_get_unwrap ( cx, expr, arglists[ 0 ] , false ) ;
792- } else if let Some ( arglists) = method_chain_args ( expr, & [ "get_mut" , "unwrap" ] ) {
793- lint_get_unwrap ( cx, expr, arglists[ 0 ] , true ) ;
794- } else if let Some ( arglists) = method_chain_args ( expr, & [ "unwrap" ] ) {
795- lint_unwrap ( cx, expr, arglists[ 0 ] ) ;
796- } else if let Some ( arglists) = method_chain_args ( expr, & [ "ok" , "expect" ] ) {
797- lint_ok_expect ( cx, expr, arglists[ 0 ] ) ;
798- } else if let Some ( arglists) = method_chain_args ( expr, & [ "map" , "unwrap_or" ] ) {
799- lint_map_unwrap_or ( cx, expr, arglists[ 0 ] , arglists[ 1 ] ) ;
800- } else if let Some ( arglists) = method_chain_args ( expr, & [ "map" , "unwrap_or_else" ] ) {
801- lint_map_unwrap_or_else ( cx, expr, arglists[ 0 ] , arglists[ 1 ] ) ;
802- } else if let Some ( arglists) = method_chain_args ( expr, & [ "map_or" ] ) {
803- lint_map_or_none ( cx, expr, arglists[ 0 ] ) ;
804- } else if let Some ( arglists) = method_chain_args ( expr, & [ "filter" , "next" ] ) {
805- lint_filter_next ( cx, expr, arglists[ 0 ] ) ;
806- } else if let Some ( arglists) = method_chain_args ( expr, & [ "filter" , "map" ] ) {
807- lint_filter_map ( cx, expr, arglists[ 0 ] , arglists[ 1 ] ) ;
808- } else if let Some ( arglists) = method_chain_args ( expr, & [ "filter_map" , "map" ] ) {
809- lint_filter_map_map ( cx, expr, arglists[ 0 ] , arglists[ 1 ] ) ;
810- } else if let Some ( arglists) = method_chain_args ( expr, & [ "filter" , "flat_map" ] ) {
811- lint_filter_flat_map ( cx, expr, arglists[ 0 ] , arglists[ 1 ] ) ;
812- } else if let Some ( arglists) = method_chain_args ( expr, & [ "filter_map" , "flat_map" ] ) {
813- lint_filter_map_flat_map ( cx, expr, arglists[ 0 ] , arglists[ 1 ] ) ;
814- } else if let Some ( arglists) = method_chain_args ( expr, & [ "map" , "flatten" ] ) {
815- lint_map_flatten ( cx, expr, arglists[ 0 ] ) ;
816- } else if let Some ( arglists) = method_chain_args ( expr, & [ "find" , "is_some" ] ) {
817- lint_search_is_some ( cx, expr, "find" , arglists[ 0 ] , arglists[ 1 ] ) ;
818- } else if let Some ( arglists) = method_chain_args ( expr, & [ "position" , "is_some" ] ) {
819- lint_search_is_some ( cx, expr, "position" , arglists[ 0 ] , arglists[ 1 ] ) ;
820- } else if let Some ( arglists) = method_chain_args ( expr, & [ "rposition" , "is_some" ] ) {
821- lint_search_is_some ( cx, expr, "rposition" , arglists[ 0 ] , arglists[ 1 ] ) ;
822- } else if let Some ( arglists) = method_chain_args ( expr, & [ "extend" ] ) {
823- lint_extend ( cx, expr, arglists[ 0 ] ) ;
824- } else if let Some ( arglists) = method_chain_args ( expr, & [ "unwrap" , "as_ptr" ] ) {
825- lint_cstring_as_ptr ( cx, expr, & arglists[ 0 ] [ 0 ] , & arglists[ 1 ] [ 0 ] ) ;
826- } else if let Some ( arglists) = method_chain_args ( expr, & [ "iter" , "nth" ] ) {
827- lint_iter_nth ( cx, expr, arglists[ 0 ] , false ) ;
828- } else if let Some ( arglists) = method_chain_args ( expr, & [ "iter_mut" , "nth" ] ) {
829- lint_iter_nth ( cx, expr, arglists[ 0 ] , true ) ;
830- } else if method_chain_args ( expr, & [ "skip" , "next" ] ) . is_some ( ) {
831- lint_iter_skip_next ( cx, expr) ;
832- } else if let Some ( arglists) = method_chain_args ( expr, & [ "cloned" , "collect" ] ) {
833- lint_iter_cloned_collect ( cx, expr, arglists[ 0 ] ) ;
834- } else if let Some ( arglists) = method_chain_args ( expr, & [ "as_ref" ] ) {
835- lint_asref ( cx, expr, "as_ref" , arglists[ 0 ] ) ;
836- } else if let Some ( arglists) = method_chain_args ( expr, & [ "as_mut" ] ) {
837- lint_asref ( cx, expr, "as_mut" , arglists[ 0 ] ) ;
838- } else if let Some ( arglists) = method_chain_args ( expr, & [ "fold" ] ) {
839- lint_unnecessary_fold ( cx, expr, arglists[ 0 ] ) ;
840- } else if let Some ( arglists) = method_chain_args ( expr, & [ "filter_map" ] ) {
841- unnecessary_filter_map:: lint ( cx, expr, arglists[ 0 ] ) ;
842- }
843823
844824 lint_or_fun_call ( cx, expr, * method_span, & method_call. ident . as_str ( ) , args) ;
845825 lint_expect_fun_call ( cx, expr, * method_span, & method_call. ident . as_str ( ) , args) ;
0 commit comments