@@ -4,16 +4,16 @@ use clippy_utils::msrvs::Msrv;
44use clippy_utils:: source:: snippet_with_applicability;
55use clippy_utils:: ty:: is_type_diagnostic_item;
66use clippy_utils:: {
7- eq_expr_value, get_parent_node, in_constant, is_else_clause, is_refutable , is_res_lang_ctor, path_to_local ,
8- path_to_local_id, peel_blocks, peel_blocks_with_stmt,
7+ eq_expr_value, get_parent_node, in_constant, is_else_clause, is_res_lang_ctor, pat_and_expr_can_be_question_mark ,
8+ path_to_local , path_to_local_id, peel_blocks, peel_blocks_with_stmt,
99} ;
1010use clippy_utils:: { higher, is_path_lang_item} ;
1111use if_chain:: if_chain;
1212use rustc_errors:: Applicability ;
1313use rustc_hir:: def:: Res ;
1414use rustc_hir:: LangItem :: { self , OptionNone , OptionSome , ResultErr , ResultOk } ;
1515use rustc_hir:: {
16- BindingAnnotation , Block , ByRef , Expr , ExprKind , Local , Node , Pat , PatKind , PathSegment , QPath , Stmt , StmtKind ,
16+ BindingAnnotation , Block , ByRef , Expr , ExprKind , Local , Node , PatKind , PathSegment , QPath , Stmt , StmtKind ,
1717} ;
1818use rustc_lint:: { LateContext , LateLintPass } ;
1919use rustc_middle:: ty:: Ty ;
@@ -95,50 +95,6 @@ enum IfBlockType<'hir> {
9595 ) ,
9696}
9797
98- /// Returns whether the given let pattern and else body can be turned into a question mark
99- ///
100- /// For this example:
101- /// ```ignore
102- /// let FooBar { a, b } = if let Some(a) = ex { a } else { return None };
103- /// ```
104- /// We get as parameters:
105- /// ```ignore
106- /// pat: Some(a)
107- /// else_body: return None
108- /// ```
109-
110- /// And for this example:
111- /// ```ignore
112- /// let Some(FooBar { a, b }) = ex else { return None };
113- /// ```
114- /// We get as parameters:
115- /// ```ignore
116- /// pat: Some(FooBar { a, b })
117- /// else_body: return None
118- /// ```
119-
120- /// We output `Some(a)` in the first instance, and `Some(FooBar { a, b })` in the second, because
121- /// the question mark operator is applicable here. Callers have to check whether we are in a
122- /// constant or not.
123- pub ( crate ) fn pat_and_expr_can_be_question_mark < ' a , ' hir > (
124- cx : & LateContext < ' _ > ,
125- pat : & ' a Pat < ' hir > ,
126- else_body : & Expr < ' _ > ,
127- ) -> Option < & ' a Pat < ' hir > > {
128- if let PatKind :: TupleStruct ( pat_path, [ inner_pat] , _) = pat. kind &&
129- is_res_lang_ctor ( cx, cx. qpath_res ( & pat_path, pat. hir_id ) , OptionSome ) &&
130- !is_refutable ( cx, inner_pat) &&
131- let else_body = peel_blocks ( else_body) &&
132- let ExprKind :: Ret ( Some ( ret_val) ) = else_body. kind &&
133- let ExprKind :: Path ( ret_path) = ret_val. kind &&
134- is_res_lang_ctor ( cx, cx. qpath_res ( & ret_path, ret_val. hir_id ) , OptionNone )
135- {
136- Some ( inner_pat)
137- } else {
138- None
139- }
140- }
141-
14298fn check_let_some_else_return_none ( cx : & LateContext < ' _ > , stmt : & Stmt < ' _ > ) {
14399 if let StmtKind :: Local ( Local { pat, init : Some ( init_expr) , els : Some ( els) , .. } ) = stmt. kind &&
144100 let Block { stmts : & [ ] , expr : Some ( els) , .. } = els &&
0 commit comments