2016-04-07 10:46:48 -05:00
use rustc ::hir ::* ;
2015-04-30 04:48:43 -05:00
use rustc ::lint ::* ;
2016-02-06 13:13:25 -06:00
use utils ::{ SpanlessEq , span_lint } ;
2015-04-30 04:48:43 -05:00
2016-02-03 13:42:05 -06:00
/// **What it does:** This lint checks for equal operands to comparison, logical and bitwise,
/// difference and division binary operators (`==`, `>`, etc., `&&`, `||`, `&`, `|`, `^`, `-` and
/// `/`).
2015-12-10 18:22:27 -06:00
///
2016-02-03 13:42:05 -06:00
/// **Why is this bad?** This is usually just a typo or a copy and paste error.
2015-12-10 18:22:27 -06:00
///
/// **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-02-06 13:13:25 -06:00
if is_valid_operator ( op ) & & SpanlessEq ::new ( cx ) . ignore_fn ( ) . eq_expr ( left , right ) {
2016-01-03 22:26:12 -06:00
span_lint ( cx ,
EQ_OP ,
e . span ,
2016-04-07 10:46:48 -05:00
& format! ( " equal expressions as operands to ` {} ` " , op . node . as_str ( ) ) ) ;
2015-04-30 04:48:43 -05:00
}
}
}
}
2016-02-03 13:42:05 -06:00
fn is_valid_operator ( op : & BinOp ) -> bool {
2015-04-30 04:48:43 -05:00
match op . node {
2016-02-03 13:42:05 -06:00
BiSub |
BiDiv |
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
}
}