use clippy_utils::diagnostics::span_lint_and_help;
use clippy_utils::sym;
use rustc_hir::{Impl, Item, ItemKind};
use rustc_lint::{LateContext, LateLintPass};
use rustc_session::declare_lint_pass;

declare_clippy_lint! {
    /// ### What it does
    /// Checks for direct implementations of `ToString`.
    /// ### Why is this bad?
    /// This trait is automatically implemented for any type which implements the `Display` trait.
    /// As such, `ToString` shouldn’t be implemented directly: `Display` should be implemented instead,
    /// and you get the `ToString` implementation for free.
    /// ### Example
    /// ```no_run
    /// struct Point {
    ///   x: usize,
    ///   y: usize,
    /// }
    ///
    /// impl ToString for Point {
    ///   fn to_string(&self) -> String {
    ///     format!("({}, {})", self.x, self.y)
    ///   }
    /// }
    /// ```
    /// Use instead:
    /// ```no_run
    /// struct Point {
    ///   x: usize,
    ///   y: usize,
    /// }
    ///
    /// impl std::fmt::Display for Point {
    ///   fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    ///     write!(f, "({}, {})", self.x, self.y)
    ///   }
    /// }
    /// ```
    #[clippy::version = "1.78.0"]
    pub TO_STRING_TRAIT_IMPL,
    style,
    "check for direct implementations of `ToString`"
}

declare_lint_pass!(ToStringTraitImpl => [TO_STRING_TRAIT_IMPL]);

impl<'tcx> LateLintPass<'tcx> for ToStringTraitImpl {
    fn check_item(&mut self, cx: &LateContext<'tcx>, it: &'tcx Item<'tcx>) {
        if let ItemKind::Impl(Impl {
            of_trait: Some(of_trait),
            ..
        }) = it.kind
            && let Some(trait_did) = of_trait.trait_ref.trait_def_id()
            && cx.tcx.is_diagnostic_item(sym::ToString, trait_did)
        {
            span_lint_and_help(
                cx,
                TO_STRING_TRAIT_IMPL,
                it.span,
                "direct implementation of `ToString`",
                None,
                "prefer implementing `Display` instead",
            );
        }
    }
}
