@@ -6,10 +6,10 @@ use clippy_utils::diagnostics::{span_lint, span_lint_and_sugg};
6
6
use clippy_utils:: higher;
7
7
use clippy_utils:: source:: snippet_with_applicability;
8
8
use clippy_utils:: sugg:: Sugg ;
9
- use clippy_utils:: { get_parent_node, is_else_clause, is_expn_of} ;
9
+ use clippy_utils:: { get_parent_node, is_else_clause, is_expn_of, peel_blocks , peel_blocks_with_stmt } ;
10
10
use rustc_ast:: ast:: LitKind ;
11
11
use rustc_errors:: Applicability ;
12
- use rustc_hir:: { BinOpKind , Block , Expr , ExprKind , HirId , Node , StmtKind , UnOp } ;
12
+ use rustc_hir:: { BinOpKind , Block , Expr , ExprKind , HirId , Node , UnOp } ;
13
13
use rustc_lint:: { LateContext , LateLintPass } ;
14
14
use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
15
15
use rustc_span:: source_map:: Spanned ;
@@ -143,8 +143,8 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessBool {
143
143
applicability,
144
144
) ;
145
145
} ;
146
- if let ExprKind :: Block ( then , _ ) = then. kind {
147
- match ( fetch_bool_block ( then ) , fetch_bool_expr ( r#else ) ) {
146
+ if let Some ( ( a , b ) ) = fetch_bool_block ( then) . and_then ( |a| Some ( ( a , fetch_bool_block ( r#else ) ? ) ) ) {
147
+ match ( a , b ) {
148
148
( RetBool ( true ) , RetBool ( true ) ) | ( Bool ( true ) , Bool ( true ) ) => {
149
149
span_lint (
150
150
cx,
@@ -167,8 +167,6 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessBool {
167
167
( Bool ( false ) , Bool ( true ) ) => reduce ( false , true ) ,
168
168
_ => ( ) ,
169
169
}
170
- } else {
171
- panic ! ( "IfExpr `then` node is not an `ExprKind::Block`" ) ;
172
170
}
173
171
}
174
172
}
@@ -271,8 +269,6 @@ fn check_comparison<'a, 'tcx>(
271
269
right_false : Option < ( impl FnOnce ( Sugg < ' a > ) -> Sugg < ' a > , & str ) > ,
272
270
no_literal : Option < ( impl FnOnce ( Sugg < ' a > , Sugg < ' a > ) -> Sugg < ' a > , & str ) > ,
273
271
) {
274
- use self :: Expression :: { Bool , Other } ;
275
-
276
272
if let ExprKind :: Binary ( op, left_side, right_side) = e. kind {
277
273
let ( l_ty, r_ty) = (
278
274
cx. typeck_results ( ) . expr_ty ( left_side) ,
@@ -304,19 +300,19 @@ fn check_comparison<'a, 'tcx>(
304
300
}
305
301
306
302
match ( fetch_bool_expr ( left_side) , fetch_bool_expr ( right_side) ) {
307
- ( Bool ( true ) , Other ) => left_true. map_or ( ( ) , |( h, m) | {
303
+ ( Some ( true ) , None ) => left_true. map_or ( ( ) , |( h, m) | {
308
304
suggest_bool_comparison ( cx, e, right_side, applicability, m, h) ;
309
305
} ) ,
310
- ( Other , Bool ( true ) ) => right_true. map_or ( ( ) , |( h, m) | {
306
+ ( None , Some ( true ) ) => right_true. map_or ( ( ) , |( h, m) | {
311
307
suggest_bool_comparison ( cx, e, left_side, applicability, m, h) ;
312
308
} ) ,
313
- ( Bool ( false ) , Other ) => left_false. map_or ( ( ) , |( h, m) | {
309
+ ( Some ( false ) , None ) => left_false. map_or ( ( ) , |( h, m) | {
314
310
suggest_bool_comparison ( cx, e, right_side, applicability, m, h) ;
315
311
} ) ,
316
- ( Other , Bool ( false ) ) => right_false. map_or ( ( ) , |( h, m) | {
312
+ ( None , Some ( false ) ) => right_false. map_or ( ( ) , |( h, m) | {
317
313
suggest_bool_comparison ( cx, e, left_side, applicability, m, h) ;
318
314
} ) ,
319
- ( Other , Other ) => no_literal. map_or ( ( ) , |( h, m) | {
315
+ ( None , None ) => no_literal. map_or ( ( ) , |( h, m) | {
320
316
let left_side = Sugg :: hir_with_applicability ( cx, left_side, ".." , & mut applicability) ;
321
317
let right_side = Sugg :: hir_with_applicability ( cx, right_side, ".." , & mut applicability) ;
322
318
span_lint_and_sugg (
@@ -365,41 +361,20 @@ fn suggest_bool_comparison<'a, 'tcx>(
365
361
enum Expression {
366
362
Bool ( bool ) ,
367
363
RetBool ( bool ) ,
368
- Other ,
369
364
}
370
365
371
- fn fetch_bool_block ( block : & Block < ' _ > ) -> Expression {
372
- match ( & * block. stmts , block. expr . as_ref ( ) ) {
373
- ( & [ ] , Some ( e) ) => fetch_bool_expr ( & * * e) ,
374
- ( & [ ref e] , None ) => {
375
- if let StmtKind :: Semi ( e) = e. kind {
376
- if let ExprKind :: Ret ( _) = e. kind {
377
- fetch_bool_expr ( e)
378
- } else {
379
- Expression :: Other
380
- }
381
- } else {
382
- Expression :: Other
383
- }
384
- } ,
385
- _ => Expression :: Other ,
366
+ fn fetch_bool_block ( expr : & Expr < ' _ > ) -> Option < Expression > {
367
+ match peel_blocks_with_stmt ( expr) . kind {
368
+ ExprKind :: Ret ( Some ( ret) ) => Some ( Expression :: RetBool ( fetch_bool_expr ( ret) ?) ) ,
369
+ _ => Some ( Expression :: Bool ( fetch_bool_expr ( expr) ?) ) ,
386
370
}
387
371
}
388
372
389
- fn fetch_bool_expr ( expr : & Expr < ' _ > ) -> Expression {
390
- match expr. kind {
391
- ExprKind :: Block ( block, _) => fetch_bool_block ( block) ,
392
- ExprKind :: Lit ( ref lit_ptr) => {
393
- if let LitKind :: Bool ( value) = lit_ptr. node {
394
- Expression :: Bool ( value)
395
- } else {
396
- Expression :: Other
397
- }
398
- } ,
399
- ExprKind :: Ret ( Some ( expr) ) => match fetch_bool_expr ( expr) {
400
- Expression :: Bool ( value) => Expression :: RetBool ( value) ,
401
- _ => Expression :: Other ,
402
- } ,
403
- _ => Expression :: Other ,
373
+ fn fetch_bool_expr ( expr : & Expr < ' _ > ) -> Option < bool > {
374
+ if let ExprKind :: Lit ( ref lit_ptr) = peel_blocks ( expr) . kind {
375
+ if let LitKind :: Bool ( value) = lit_ptr. node {
376
+ return Some ( value) ;
377
+ }
404
378
}
379
+ None
405
380
}
0 commit comments