// run-rustfix

#![warn(clippy::needless_bool)]
#![allow(
    unused,
    dead_code,
    clippy::no_effect,
    clippy::if_same_then_else,
    clippy::needless_return
)]

use std::cell::Cell;

macro_rules! bool_comparison_trigger {
    ($($i:ident: $def:expr, $stb:expr );+  $(;)*) => (

        #[derive(Clone)]
        pub struct Trigger {
            $($i: (Cell<bool>, bool, bool)),+
        }

        #[allow(dead_code)]
        impl Trigger {
            pub fn trigger(&self, key: &str) -> bool {
                $(
                    if let stringify!($i) = key {
                        return self.$i.1 && self.$i.2 == $def;
                    }
                 )+
                false
            }
        }
    )
}

fn main() {
    let x = true;
    let y = false;
    if x {
        true
    } else {
        false
    };
    if x {
        false
    } else {
        true
    };
    if x && y {
        false
    } else {
        true
    };
    if x {
        x
    } else {
        false
    }; // would also be questionable, but we don't catch this yet
    bool_ret3(x);
    bool_ret4(x);
    bool_ret5(x, x);
    bool_ret6(x, x);
    needless_bool(x);
    needless_bool2(x);
    needless_bool3(x);
}

fn bool_ret3(x: bool) -> bool {
    if x {
        return true;
    } else {
        return false;
    };
}

fn bool_ret4(x: bool) -> bool {
    if x {
        return false;
    } else {
        return true;
    };
}

fn bool_ret5(x: bool, y: bool) -> bool {
    if x && y {
        return true;
    } else {
        return false;
    };
}

fn bool_ret6(x: bool, y: bool) -> bool {
    if x && y {
        return false;
    } else {
        return true;
    };
}

fn needless_bool(x: bool) {
    if x == true {};
}

fn needless_bool2(x: bool) {
    if x == false {};
}

fn needless_bool3(x: bool) {
    bool_comparison_trigger! {
        test_one:   false, false;
        test_three: false, false;
        test_two:   true, true;
    }

    if x == true {};
    if x == false {};
}

fn needless_bool_in_the_suggestion_wraps_the_predicate_of_if_else_statement_in_brackets() {
    let b = false;
    let returns_bool = || false;

    let x = if b {
        true
    } else if returns_bool() {
        false
    } else {
        true
    };
}
