Skip to content

Commit

Permalink
Changed the location of the suggestion as well as the way the suggest…
Browse files Browse the repository at this point in the history
…ion is assembled
  • Loading branch information
1c3t3a committed Aug 26, 2020
1 parent 179df0b commit 2d85314
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 27 deletions.
30 changes: 14 additions & 16 deletions clippy_lints/src/float_equality_without_abs.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::utils::{match_qpath, paths, snippet, span_lint_and_sugg};
use crate::utils::{match_qpath, paths, span_lint_and_then, sugg};
use if_chain::if_chain;
use rustc_ast::util::parser::AssocOp;
use rustc_errors::Applicability;
use rustc_hir::{BinOpKind, Expr, ExprKind};
use rustc_lint::{LateContext, LateLintPass};
Expand Down Expand Up @@ -84,27 +85,24 @@ impl<'tcx> LateLintPass<'tcx> for FloatEqualityWithoutAbs {
if let ty::Float(_) = t_val_r.kind;

then {
// get the snippet string
let lhs_string = snippet(
cx,
lhs.span,
"(...)",
);
let sug_l = sugg::Sugg::hir(cx, &val_l, "..");
let sug_r = sugg::Sugg::hir(cx, &val_r, "..");
// format the suggestion
let suggestion = if lhs_string.starts_with('(') {
format!("{}.abs()", lhs_string)
} else {
format!("({}).abs()", lhs_string)
};
let suggestion = format!("{}.abs()", sugg::make_assoc(AssocOp::Subtract, &sug_l, &sug_r).maybe_par());
// spans the lint
span_lint_and_sugg(
span_lint_and_then(
cx,
FLOAT_EQUALITY_WITHOUT_ABS,
expr.span,
"float equality check without `.abs()`",
"add `.abs()`",
suggestion,
Applicability::MaybeIncorrect,
| diag | {
diag.span_suggestion(
lhs.span,
"add `.abs()`",
suggestion,
Applicability::MaybeIncorrect,
);
}
);
}
}
Expand Down
44 changes: 33 additions & 11 deletions tests/ui/float_equality_without_abs.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,69 +2,91 @@ error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:4:5
|
LL | (a - b) < f32::EPSILON
| ^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a - b).abs()`
| -------^^^^^^^^^^^^^^^
| |
| help: add `.abs()`: `(a - b).abs()`
|
= note: `-D clippy::float-equality-without-abs` implied by `-D warnings`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:13:13
|
LL | let _ = (a - b) < f32::EPSILON;
| ^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a - b).abs()`
| -------^^^^^^^^^^^^^^^
| |
| help: add `.abs()`: `(a - b).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:14:13
|
LL | let _ = a - b < f32::EPSILON;
| ^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a - b).abs()`
| -----^^^^^^^^^^^^^^^
| |
| help: add `.abs()`: `(a - b).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:15:13
|
LL | let _ = a - b.abs() < f32::EPSILON;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a - b.abs()).abs()`
| -----------^^^^^^^^^^^^^^^
| |
| help: add `.abs()`: `(a - b.abs()).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:16:13
|
LL | let _ = (a as f64 - b as f64) < f64::EPSILON;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a as f64 - b as f64).abs()`
| ---------------------^^^^^^^^^^^^^^^
| |
| help: add `.abs()`: `(a as f64 - b as f64).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:17:13
|
LL | let _ = 1.0 - 2.0 < f32::EPSILON;
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(1.0 - 2.0).abs()`
| ---------^^^^^^^^^^^^^^^
| |
| help: add `.abs()`: `(1.0 - 2.0).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:19:13
|
LL | let _ = f32::EPSILON > (a - b);
| ^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a - b).abs()`
| ^^^^^^^^^^^^^^^-------
| |
| help: add `.abs()`: `(a - b).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:20:13
|
LL | let _ = f32::EPSILON > a - b;
| ^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a - b).abs()`
| ^^^^^^^^^^^^^^^-----
| |
| help: add `.abs()`: `(a - b).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:21:13
|
LL | let _ = f32::EPSILON > a - b.abs();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a - b.abs()).abs()`
| ^^^^^^^^^^^^^^^-----------
| |
| help: add `.abs()`: `(a - b.abs()).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:22:13
|
LL | let _ = f64::EPSILON > (a as f64 - b as f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(a as f64 - b as f64).abs()`
| ^^^^^^^^^^^^^^^---------------------
| |
| help: add `.abs()`: `(a as f64 - b as f64).abs()`

error: float equality check without `.abs()`
--> $DIR/float_equality_without_abs.rs:23:13
|
LL | let _ = f32::EPSILON > 1.0 - 2.0;
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: add `.abs()`: `(1.0 - 2.0).abs()`
| ^^^^^^^^^^^^^^^---------
| |
| help: add `.abs()`: `(1.0 - 2.0).abs()`

error: aborting due to 11 previous errors

0 comments on commit 2d85314

Please sign in to comment.