From b348aae767aec2680affe090b10a6bc0af85bc7c Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Wed, 28 Aug 2019 02:54:03 +0900 Subject: [PATCH 1/2] Add note to avoid confusing --- doc/adding_lints.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/adding_lints.md b/doc/adding_lints.md index c9816911a82..1fb26c66d9f 100644 --- a/doc/adding_lints.md +++ b/doc/adding_lints.md @@ -86,6 +86,8 @@ test. That allows us to check if the output is turning into what we want. Once we are satisfied with the output, we need to run `tests/ui/update-all-references.sh` to update the `.stderr` file for our lint. +Please note that, we should run `TESTNAME=ui/foo_functions cargo uitest` +every time before running `tests/ui/update-all-references.sh`. Running `TESTNAME=ui/foo_functions cargo uitest` should pass then. When we commit our lint, we need to commit the generated `.stderr` files, too. From 1dca950ac4c608263dbf208d923c426e5c1ea500 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Wed, 28 Aug 2019 04:23:26 +0900 Subject: [PATCH 2/2] Fix `inherent_to_string` false positive --- clippy_lints/src/inherent_to_string.rs | 1 + tests/ui/inherent_to_string.rs | 12 ++++++++++++ tests/ui/inherent_to_string.stderr | 4 ++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/clippy_lints/src/inherent_to_string.rs b/clippy_lints/src/inherent_to_string.rs index eb29a6d436a..26b9657589f 100644 --- a/clippy_lints/src/inherent_to_string.rs +++ b/clippy_lints/src/inherent_to_string.rs @@ -104,6 +104,7 @@ fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, impl_item: &'tcx ImplI if impl_item.ident.name.as_str() == "to_string"; let decl = &signature.decl; if decl.implicit_self.has_implicit_self(); + if decl.inputs.len() == 1; // Check if return type is String if match_type(cx, return_ty(cx, impl_item.hir_id), &paths::STRING); diff --git a/tests/ui/inherent_to_string.rs b/tests/ui/inherent_to_string.rs index fc21b5cbc3f..e6cf337d1bb 100644 --- a/tests/ui/inherent_to_string.rs +++ b/tests/ui/inherent_to_string.rs @@ -1,5 +1,6 @@ #![warn(clippy::inherent_to_string)] #![deny(clippy::inherent_to_string_shadow_display)] +#![allow(clippy::many_single_char_names)] use std::fmt; @@ -12,6 +13,7 @@ trait FalsePositive { struct C; struct D; struct E; +struct F; impl A { // Should be detected; emit warning @@ -64,6 +66,13 @@ fn to_string() -> String { } } +impl F { + // Should not be detected, as it does not match the function signature + fn to_string(&self, _i: i32) -> String { + "F.to_string()".to_string() + } +} + fn main() { let a = A; a.to_string(); @@ -81,4 +90,7 @@ fn main() { d.to_string(); E::to_string(); + + let f = F; + f.to_string(1); } diff --git a/tests/ui/inherent_to_string.stderr b/tests/ui/inherent_to_string.stderr index 5252a168830..76d1bb873eb 100644 --- a/tests/ui/inherent_to_string.stderr +++ b/tests/ui/inherent_to_string.stderr @@ -1,5 +1,5 @@ error: implementation of inherent method `to_string(&self) -> String` for type `A` - --> $DIR/inherent_to_string.rs:18:5 + --> $DIR/inherent_to_string.rs:20:5 | LL | / fn to_string(&self) -> String { LL | | "A.to_string()".to_string() @@ -10,7 +10,7 @@ LL | | } = help: implement trait `Display` for type `A` instead error: type `C` implements inherent method `to_string(&self) -> String` which shadows the implementation of `Display` - --> $DIR/inherent_to_string.rs:42:5 + --> $DIR/inherent_to_string.rs:44:5 | LL | / fn to_string(&self) -> String { LL | | "C.to_string()".to_string()