@@ -16,12 +16,13 @@ use crate::rustc::{declare_tool_lint, lint_array};
16
16
use crate :: rustc_errors:: Applicability ;
17
17
use crate :: syntax:: ast;
18
18
use crate :: syntax:: source_map:: { BytePos , Span } ;
19
+ use crate :: syntax:: symbol:: LocalInternedString ;
19
20
use crate :: utils:: paths;
20
21
use crate :: utils:: sugg;
21
22
use crate :: utils:: {
22
23
get_arg_name, get_trait_def_id, implements_trait, in_macro, is_copy, is_expn_of, is_self, is_self_ty,
23
24
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,
25
26
span_lint_and_sugg, span_lint_and_then, span_note_and_lint, walk_ptrs_ty, walk_ptrs_ty_depth, SpanlessEq ,
26
27
} ;
27
28
use if_chain:: if_chain;
@@ -790,63 +791,42 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass {
790
791
return ;
791
792
}
792
793
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
+
793
828
match expr. node {
794
829
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
- }
850
830
851
831
lint_or_fun_call ( cx, expr, * method_span, & method_call. ident . as_str ( ) , args) ;
852
832
lint_expect_fun_call ( cx, expr, * method_span, & method_call. ident . as_str ( ) , args) ;
0 commit comments