2016-04-07 17:46:48 +02:00
use rustc ::hir ::* ;
2015-04-30 11:48:43 +02:00
use rustc ::lint ::* ;
2016-02-06 20:13:25 +01:00
use utils ::{ SpanlessEq , span_lint } ;
2015-04-30 11:48:43 +02:00
2016-02-03 20:42:05 +01:00
/// **What it does:** This lint checks for equal operands to comparison, logical and bitwise,
/// difference and division binary operators (`==`, `>`, etc., `&&`, `||`, `&`, `|`, `^`, `-` and
/// `/`).
2015-12-11 01:22:27 +01:00
///
2016-02-03 20:42:05 +01:00
/// **Why is this bad?** This is usually just a typo or a copy and paste error.
2015-12-11 01:22:27 +01: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 11:48:43 +02:00
declare_lint! {
pub EQ_OP ,
Warn ,
2015-08-13 10:32:35 +02:00
" equal operands on both sides of a comparison or bitwise combination (e.g. `x == x`) "
2015-04-30 11:48:43 +02:00
}
#[ derive(Copy,Clone) ]
pub struct EqOp ;
impl LintPass for EqOp {
fn get_lints ( & self ) -> LintArray {
lint_array! ( EQ_OP )
}
2015-09-19 08:23:04 +05:30
}
2015-08-11 20:22:20 +02:00
2015-09-19 08:23:04 +05:30
impl LateLintPass for EqOp {
fn check_expr ( & mut self , cx : & LateContext , e : & Expr ) {
2015-04-30 11:48:43 +02:00
if let ExprBinary ( ref op , ref left , ref right ) = e . node {
2016-02-06 20:13:25 +01:00
if is_valid_operator ( op ) & & SpanlessEq ::new ( cx ) . ignore_fn ( ) . eq_expr ( left , right ) {
2016-01-04 09:56:12 +05:30
span_lint ( cx ,
EQ_OP ,
e . span ,
2016-04-07 17:46:48 +02:00
& format! ( " equal expressions as operands to ` {} ` " , op . node . as_str ( ) ) ) ;
2015-04-30 11:48:43 +02:00
}
}
}
}
2016-02-03 20:42:05 +01:00
fn is_valid_operator ( op : & BinOp ) -> bool {
2015-04-30 11:48:43 +02:00
match op . node {
2016-02-03 20:42:05 +01:00
BiSub |
BiDiv |
2016-01-04 09:56:12 +05:30
BiEq |
BiLt |
BiLe |
BiGt |
BiGe |
BiNe |
BiAnd |
BiOr |
BiBitXor |
BiBitAnd |
BiBitOr = > true ,
_ = > false ,
2015-04-30 11:48:43 +02:00
}
}