//@no-rustfix
//@revisions: default extend
//@[default] rustc-env:CLIPPY_CONF_DIR=tests/ui-toml/renamed_function_params/default
//@[extend] rustc-env:CLIPPY_CONF_DIR=tests/ui-toml/renamed_function_params/extend
#![warn(clippy::renamed_function_params)]
#![allow(clippy::partialeq_ne_impl, clippy::to_string_trait_impl)]
#![allow(unused)]

use std::hash::{Hash, Hasher};

struct A;
impl From<A> for String {
    fn from(_value: A) -> Self {
        String::new()
    }
}
impl ToString for A {
    fn to_string(&self) -> String {
        String::new()
    }
}

struct B(u32);
impl std::convert::From<B> for String {
    fn from(b: B) -> Self {
        b.0.to_string()
    }
}
impl PartialEq for B {
    fn eq(&self, rhs: &Self) -> bool {
        //~^ ERROR: renamed function parameter of trait impl
        self.0 == rhs.0
    }
    fn ne(&self, rhs: &Self) -> bool {
        //~^ ERROR: renamed function parameter of trait impl
        self.0 != rhs.0
    }
}

trait MyTrait {
    fn foo(&self, val: u8);
    fn bar(a: u8, b: u8);
    fn baz(self, _val: u8);
    fn quz(&self, _: u8);
}

impl MyTrait for B {
    fn foo(&self, i_dont_wanna_use_your_name: u8) {} // only lint in `extend`
    fn bar(_a: u8, _: u8) {}
    fn baz(self, val: u8) {}
    fn quz(&self, val: u8) {}
}

impl Hash for B {
    fn hash<H: Hasher>(&self, states: &mut H) {
        //~^ ERROR: renamed function parameter of trait impl
        self.0.hash(states);
    }
    fn hash_slice<H: Hasher>(date: &[Self], states: &mut H) {
        //~^ ERROR: renamed function parameters of trait impl
        for d in date {
            d.hash(states);
        }
    }
}

impl B {
    fn totally_irrelevant(&self, right: bool) {}
    fn some_fn(&self, other: impl MyTrait) {}
}

#[derive(Copy, Clone)]
enum C {
    A,
    B(u32),
}

impl std::ops::Add<B> for C {
    type Output = C;
    fn add(self, b: B) -> C {
        // only lint in `extend`
        C::B(b.0)
    }
}

impl From<A> for C {
    fn from(_: A) -> C {
        C::A
    }
}

trait CustomTraitA {
    fn foo(&self, other: u32);
}
trait CustomTraitB {
    fn bar(&self, value: u8);
}

macro_rules! impl_trait {
    ($impl_for:ident, $tr:ty, $fn_name:ident, $t:ty) => {
        impl $tr for $impl_for {
            fn $fn_name(&self, v: $t) {}
        }
    };
}

impl_trait!(C, CustomTraitA, foo, u32);
impl_trait!(C, CustomTraitB, bar, u8);

fn main() {}
