#![allow(unused, clippy::needless_lifetimes)]
#![warn(
    clippy::style,
    clippy::mem_replace_option_with_none,
    clippy::mem_replace_with_default
)]

use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque};
use std::mem;

fn replace_option_with_none() {
    let mut an_option = Some(1);
    let _ = an_option.take();
    //~^ mem_replace_option_with_none
    let an_option = &mut Some(1);
    let _ = an_option.take();
    //~^ mem_replace_option_with_none
}

fn replace_with_default() {
    let mut s = String::from("foo");
    let _ = std::mem::take(&mut s);
    //~^ mem_replace_with_default
    let _ = std::mem::take(&mut s);
    //~^ mem_replace_with_default

    let s = &mut String::from("foo");
    let _ = std::mem::take(s);
    //~^ mem_replace_with_default
    let _ = std::mem::take(s);
    //~^ mem_replace_with_default
    let _ = std::mem::take(s);
    //~^ mem_replace_with_default

    let mut v = vec![123];
    let _ = std::mem::take(&mut v);
    //~^ mem_replace_with_default
    let _ = std::mem::take(&mut v);
    //~^ mem_replace_with_default
    let _ = std::mem::take(&mut v);
    //~^ mem_replace_with_default
    let _ = std::mem::take(&mut v);
    //~^ mem_replace_with_default

    let mut hash_map: HashMap<i32, i32> = HashMap::new();
    let _ = std::mem::take(&mut hash_map);
    //~^ mem_replace_with_default

    let mut btree_map: BTreeMap<i32, i32> = BTreeMap::new();
    let _ = std::mem::take(&mut btree_map);
    //~^ mem_replace_with_default

    let mut vd: VecDeque<i32> = VecDeque::new();
    let _ = std::mem::take(&mut vd);
    //~^ mem_replace_with_default

    let mut hash_set: HashSet<&str> = HashSet::new();
    let _ = std::mem::take(&mut hash_set);
    //~^ mem_replace_with_default

    let mut btree_set: BTreeSet<&str> = BTreeSet::new();
    let _ = std::mem::take(&mut btree_set);
    //~^ mem_replace_with_default

    let mut list: LinkedList<i32> = LinkedList::new();
    let _ = std::mem::take(&mut list);
    //~^ mem_replace_with_default

    let mut binary_heap: BinaryHeap<i32> = BinaryHeap::new();
    let _ = std::mem::take(&mut binary_heap);
    //~^ mem_replace_with_default

    let mut tuple = (vec![1, 2], BinaryHeap::<i32>::new());
    let _ = std::mem::take(&mut tuple);
    //~^ mem_replace_with_default

    let mut refstr = "hello";
    let _ = std::mem::take(&mut refstr);
    //~^ mem_replace_with_default

    let mut slice: &[i32] = &[1, 2, 3];
    let _ = std::mem::take(&mut slice);
    //~^ mem_replace_with_default
}

// lint is disabled for primitives because in this case `take`
// has no clear benefit over `replace` and sometimes is harder to read
fn dont_lint_primitive() {
    let mut pbool = true;
    let _ = std::mem::replace(&mut pbool, false);

    let mut pint = 5;
    let _ = std::mem::replace(&mut pint, 0);
}

// lint is disabled for expressions that are not used because changing to `take` is not the
// recommended fix. Additionally, the `replace` is #[must_use], so that lint will provide
// the correct suggestion
fn dont_lint_not_used() {
    let mut s = String::from("foo");
    std::mem::replace(&mut s, String::default());
}

fn main() {
    replace_option_with_none();
    replace_with_default();
    dont_lint_primitive();
}

#[clippy::msrv = "1.39"]
fn msrv_1_39() {
    let mut s = String::from("foo");
    let _ = std::mem::replace(&mut s, String::default());
}

#[clippy::msrv = "1.40"]
fn msrv_1_40() {
    let mut s = String::from("foo");
    let _ = std::mem::take(&mut s);
    //~^ mem_replace_with_default
}

fn issue9824() {
    struct Foo<'a>(Option<&'a str>);
    impl<'a> std::ops::Deref for Foo<'a> {
        type Target = Option<&'a str>;

        fn deref(&self) -> &Self::Target {
            &self.0
        }
    }
    impl<'a> std::ops::DerefMut for Foo<'a> {
        fn deref_mut(&mut self) -> &mut Self::Target {
            &mut self.0
        }
    }

    struct Bar {
        opt: Option<u8>,
        val: String,
    }

    let mut f = Foo(Some("foo"));
    let mut b = Bar {
        opt: Some(1),
        val: String::from("bar"),
    };

    // replace option with none
    let _ = f.0.take();
    //~^ mem_replace_option_with_none
    let _ = (*f).take();
    //~^ mem_replace_option_with_none
    let _ = b.opt.take();
    //~^ mem_replace_option_with_none
    // replace with default
    let _ = std::mem::take(&mut b.val);
    //~^ mem_replace_with_default
}

#[clippy::msrv = "1.31"]
fn mem_replace_option_with_some() {
    let mut an_option = Some(0);
    let replaced = an_option.replace(1);
    //~^ ERROR: replacing an `Option` with `Some(..)`

    let mut an_option = &mut Some(0);
    let replaced = an_option.replace(1);
    //~^ ERROR: replacing an `Option` with `Some(..)`

    let (mut opt1, mut opt2) = (Some(0), Some(0));
    let b = true;
    let replaced = (if b { &mut opt1 } else { &mut opt2 }).replace(1);
    //~^ ERROR: replacing an `Option` with `Some(..)`
}

#[clippy::msrv = "1.30"]
fn mem_replace_option_with_some_bad_msrv() {
    let mut an_option = Some(0);
    let replaced = mem::replace(&mut an_option, Some(1));
}

fn issue15785() {
    let mut text = String::from("foo");
    let replaced = std::mem::take(dbg!(&mut text));
    //~^ mem_replace_with_default
}
