use clippy_utils::source::{first_line_of_span, indent_of, reindent_multiline, snippet, snippet_opt};
use clippy_utils::{
both, count_eq, eq_expr_value, get_enclosing_block, get_parent_expr, if_sequence, in_macro, is_else_clause,
- run_lints, search_same, ContainsName, SpanlessEq, SpanlessHash,
+ is_lint_allowed, search_same, ContainsName, SpanlessEq, SpanlessHash,
};
use if_chain::if_chain;
use rustc_data_structures::fx::FxHashSet;
use std::borrow::Cow;
declare_clippy_lint! {
- /// **What it does:** Checks for consecutive `if`s with the same condition.
+ /// ### What it does
+ /// Checks for consecutive `if`s with the same condition.
///
- /// **Why is this bad?** This is probably a copy & paste error.
+ /// ### Why is this bad?
+ /// This is probably a copy & paste error.
///
- /// **Known problems:** Hopefully none.
- ///
- /// **Example:**
+ /// ### Example
/// ```ignore
/// if a == b {
/// …
}
declare_clippy_lint! {
- /// **What it does:** Checks for consecutive `if`s with the same function call.
+ /// ### What it does
+ /// Checks for consecutive `if`s with the same function call.
///
- /// **Why is this bad?** This is probably a copy & paste error.
+ /// ### Why is this bad?
+ /// This is probably a copy & paste error.
/// Despite the fact that function can have side effects and `if` works as
/// intended, such an approach is implicit and can be considered a "code smell".
///
- /// **Known problems:** Hopefully none.
- ///
- /// **Example:**
+ /// ### Example
/// ```ignore
/// if foo() == bar {
/// …
}
declare_clippy_lint! {
- /// **What it does:** Checks for `if/else` with the same body as the *then* part
+ /// ### What it does
+ /// Checks for `if/else` with the same body as the *then* part
/// and the *else* part.
///
- /// **Why is this bad?** This is probably a copy & paste error.
+ /// ### Why is this bad?
+ /// This is probably a copy & paste error.
///
- /// **Known problems:** Hopefully none.
- ///
- /// **Example:**
+ /// ### Example
/// ```ignore
/// let foo = if … {
/// 42
}
declare_clippy_lint! {
- /// **What it does:** Checks if the `if` and `else` block contain shared code that can be
+ /// ### What it does
+ /// Checks if the `if` and `else` block contain shared code that can be
/// moved out of the blocks.
///
- /// **Why is this bad?** Duplicate code is less maintainable.
+ /// ### Why is this bad?
+ /// Duplicate code is less maintainable.
///
- /// **Known problems:** Hopefully none.
+ /// ### Known problems
+ /// * The lint doesn't check if the moved expressions modify values that are beeing used in
+ /// the if condition. The suggestion can in that case modify the behavior of the program.
+ /// See [rust-clippy#7452](https://github.com/rust-lang/rust-clippy/issues/7452)
///
- /// **Example:**
+ /// ### Example
/// ```ignore
/// let foo = if … {
/// println!("Hello World");
if block_expr_eq;
if l_stmts.len() == r_stmts.len();
if l_stmts.len() == current_start_eq;
- if run_lints(cx, &[IF_SAME_THEN_ELSE], win[0].hir_id);
- if run_lints(cx, &[IF_SAME_THEN_ELSE], win[1].hir_id);
+ if !is_lint_allowed(cx, IF_SAME_THEN_ELSE, win[0].hir_id);
+ if !is_lint_allowed(cx, IF_SAME_THEN_ELSE, win[1].hir_id);
then {
span_lint_and_note(
cx,
expr_eq &= block_expr_eq;
}
- let has_expr = blocks[0].expr.is_some();
- if has_expr && !expr_eq {
+ if !expr_eq {
end_eq = 0;
}