@@ -98,12 +98,12 @@ impl QuestionMark {
9898 if let Some ( higher:: IfLet { let_pat, let_expr, if_then, if_else } )
9999 = higher:: IfLet :: hir( cx, expr) ;
100100 if let PatKind :: TupleStruct ( ref path1, fields, None ) = let_pat. kind;
101- // Only check one of the blocks
102101 let nested_expr = if_else. unwrap_or( if_then) ;
103- if Self :: check_lang_items( cx, path1, & [ OptionSome , ResultOk , ResultErr ] ) ;
104102 if let PatKind :: Binding ( annot, bind_id, ident, _) = fields[ 0 ] . kind;
105- if Self :: result_check_and_early_return( cx, let_expr, nested_expr, Some ( ident. name) )
106- || Self :: option_check_and_early_return( cx, let_expr, nested_expr) ;
103+ if ( Self :: result_check_and_early_return( cx, let_expr, nested_expr, Some ( ident. name) ) &&
104+ ( is_lang_ctor( cx, path1, ResultOk ) || is_lang_ctor( cx, path1, ResultErr ) ) ) ||
105+ ( Self :: option_check_and_early_return( cx, let_expr, nested_expr) &&
106+ is_lang_ctor( cx, path1, OptionSome ) ) ;
107107 let by_ref = matches!( annot, BindingAnnotation :: Ref | BindingAnnotation :: RefMut ) ;
108108 then {
109109 let mut applicability = Applicability :: MachineApplicable ;
@@ -128,22 +128,13 @@ impl QuestionMark {
128128 }
129129 }
130130
131- fn check_lang_items ( cx : & LateContext < ' _ > , qpath : & QPath < ' _ > , items : & [ rustc_hir:: LangItem ] ) -> bool {
132- for lang_item in items {
133- if is_lang_ctor ( cx, qpath, * lang_item) {
134- return true ;
135- }
136- }
137- false
138- }
139-
140131 fn result_check_and_early_return (
141132 cx : & LateContext < ' _ > ,
142133 expr : & Expr < ' _ > ,
143134 nested_expr : & Expr < ' _ > ,
144- symbol : Option < Symbol > ,
135+ pat_symbol : Option < Symbol > ,
145136 ) -> bool {
146- Self :: is_result ( cx, expr) && Self :: expression_returns_unmodified_err ( cx, nested_expr, expr, symbol )
137+ Self :: is_result ( cx, expr) && Self :: expression_returns_unmodified_err ( cx, nested_expr, expr, pat_symbol )
147138 }
148139
149140 fn option_check_and_early_return ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > , nested_expr : & Expr < ' _ > ) -> bool {
@@ -180,19 +171,22 @@ impl QuestionMark {
180171 cx : & LateContext < ' _ > ,
181172 expr : & Expr < ' _ > ,
182173 cond_expr : & Expr < ' _ > ,
183- symbol : Option < Symbol > ,
174+ pat_symbol : Option < Symbol > ,
184175 ) -> bool {
185176 match & peel_blocks_with_stmt ( expr) . kind {
186- ExprKind :: Ret ( Some ( ret_expr) ) =>
187- Self :: expression_returns_unmodified_err ( cx, ret_expr, cond_expr, symbol) ,
188- ExprKind :: Path ( _) =>
189- path_to_local ( expr) . is_some ( ) && path_to_local ( expr) == path_to_local ( cond_expr) ,
190- ExprKind :: Call ( _, args_expr) => {
191- if let Some ( arg) = args_expr. first ( ) {
192- if let Some ( name) = symbol {
193- return clippy_utils:: contains_name ( name, arg) ;
194- }
177+ ExprKind :: Ret ( Some ( ret_expr) ) => {
178+ Self :: expression_returns_unmodified_err ( cx, ret_expr, cond_expr, pat_symbol)
179+ } ,
180+ ExprKind :: Path ( _) => path_to_local ( expr) . is_some ( ) && path_to_local ( expr) == path_to_local ( cond_expr) ,
181+ ExprKind :: Call ( call_expr, args_expr) => {
182+ if let ExprKind :: Path ( qpath) = & call_expr. kind
183+ && let QPath :: Resolved ( _, path) = qpath
184+ && let Some ( pat_sym) = pat_symbol
185+ && let Some ( arg) = args_expr. first ( )
186+ {
187+ return path. segments [ 0 ] . ident . name . as_str ( ) == "Err" && clippy_utils:: contains_name ( pat_sym, arg)
195188 }
189+
196190 false
197191 } ,
198192 _ => false ,
0 commit comments