2015-04-30 04:48:43 -05:00
use rustc ::lint ::* ;
2015-09-03 09:42:17 -05:00
use rustc_front ::hir ::* ;
use rustc_front ::util as ast_util ;
2015-08-16 01:54:43 -05:00
2016-01-03 08:49:25 -06:00
use utils ::{ is_exp_equal , span_lint } ;
2015-04-30 04:48:43 -05:00
2016-02-05 17:41:54 -06:00
/// **What it does:** This lint checks for equal operands to comparisons and bitwise binary operators (`&`, `|` and `^`).
2015-12-10 18:22:27 -06:00
///
/// **Why is this bad?** This is usually just a typo.
///
/// **Known problems:** False negatives: We had some false positives regarding calls (notably [racer](https://github.com/phildawes/racer) had one instance of `x.pop() && x.pop()`), so we removed matching any function or method calls. We may introduce a whitelist of known pure functions in the future.
///
/// **Example:** `x + 1 == x + 1`
2015-04-30 04:48:43 -05:00
declare_lint! {
pub EQ_OP ,
Warn ,
2015-08-13 03:32:35 -05:00
" equal operands on both sides of a comparison or bitwise combination (e.g. `x == x`) "
2015-04-30 04:48:43 -05:00
}
#[ derive(Copy,Clone) ]
pub struct EqOp ;
impl LintPass for EqOp {
fn get_lints ( & self ) -> LintArray {
lint_array! ( EQ_OP )
}
2015-09-18 21:53:04 -05:00
}
2015-08-11 13:22:20 -05:00
2015-09-18 21:53:04 -05:00
impl LateLintPass for EqOp {
fn check_expr ( & mut self , cx : & LateContext , e : & Expr ) {
2015-04-30 04:48:43 -05:00
if let ExprBinary ( ref op , ref left , ref right ) = e . node {
2016-01-30 13:10:14 -06:00
if is_cmp_or_bit ( op ) & & is_exp_equal ( cx , left , right , true ) {
2016-01-03 22:26:12 -06:00
span_lint ( cx ,
EQ_OP ,
e . span ,
& format! ( " equal expressions as operands to {} " , ast_util ::binop_to_string ( op . node ) ) ) ;
2015-04-30 04:48:43 -05:00
}
}
}
}
2016-01-03 22:26:12 -06:00
fn is_cmp_or_bit ( op : & BinOp ) -> bool {
2015-04-30 04:48:43 -05:00
match op . node {
2016-01-03 22:26:12 -06:00
BiEq |
BiLt |
BiLe |
BiGt |
BiGe |
BiNe |
BiAnd |
BiOr |
BiBitXor |
BiBitAnd |
BiBitOr = > true ,
_ = > false ,
2015-04-30 04:48:43 -05:00
}
}