From 13ce96c4bfd236ec49bcd7b63f42f9a51b0ee599 Mon Sep 17 00:00:00 2001 From: Josh Mcguigan Date: Wed, 3 Oct 2018 03:55:31 -0700 Subject: [PATCH] new_ret_no_self corrected panic and added test stderr --- clippy_lints/src/methods/mod.rs | 16 ++++--- tests/ui/new_ret_no_self.rs | 76 ++++++++++++++++----------------- tests/ui/new_ret_no_self.stderr | 18 ++++++++ 3 files changed, 65 insertions(+), 45 deletions(-) create mode 100644 tests/ui/new_ret_no_self.stderr diff --git a/clippy_lints/src/methods/mod.rs b/clippy_lints/src/methods/mod.rs index d11dbf0e773..81cb1cd1182 100644 --- a/clippy_lints/src/methods/mod.rs +++ b/clippy_lints/src/methods/mod.rs @@ -931,13 +931,15 @@ fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, implitem: &'tcx hir::I } } - let ret_ty = return_ty(cx, implitem.id); - if name == "new" && - !ret_ty.walk().any(|t| same_tys(cx, t, ty)) { - span_lint(cx, - NEW_RET_NO_SELF, - implitem.span, - "methods called `new` usually return `Self`"); + if let hir::ImplItemKind::Method(ref sig, id) = implitem.node { + let ret_ty = return_ty(cx, implitem.id); + if name == "new" && + !ret_ty.walk().any(|t| same_tys(cx, t, ty)) { + span_lint(cx, + NEW_RET_NO_SELF, + implitem.span, + "methods called `new` usually return `Self`"); + } } } } diff --git a/tests/ui/new_ret_no_self.rs b/tests/ui/new_ret_no_self.rs index 67933f00262..762dd582168 100644 --- a/tests/ui/new_ret_no_self.rs +++ b/tests/ui/new_ret_no_self.rs @@ -5,44 +5,44 @@ fn main(){} -//trait R { -// type Item; -//} -// -//struct S; -// -//impl R for S { -// type Item = Self; -//} -// -//impl S { -// // should not trigger the lint -// pub fn new() -> impl R { -// S -// } -//} -// -//struct S2; -// -//impl R for S2 { -// type Item = Self; -//} -// -//impl S2 { -// // should not trigger the lint -// pub fn new(_: String) -> impl R { -// S2 -// } -//} -// -//struct T; -// -//impl T { -// // should not trigger lint -// pub fn new() -> Self { -// unimplemented!(); -// } -//} +trait R { + type Item; +} + +struct S; + +impl R for S { + type Item = Self; +} + +impl S { + // should not trigger the lint + pub fn new() -> impl R { + S + } +} + +struct S2; + +impl R for S2 { + type Item = Self; +} + +impl S2 { + // should not trigger the lint + pub fn new(_: String) -> impl R { + S2 + } +} + +struct T; + +impl T { + // should not trigger lint + pub fn new() -> Self { + unimplemented!(); + } +} struct U; diff --git a/tests/ui/new_ret_no_self.stderr b/tests/ui/new_ret_no_self.stderr new file mode 100644 index 00000000000..1d698892449 --- /dev/null +++ b/tests/ui/new_ret_no_self.stderr @@ -0,0 +1,18 @@ +error: methods called `new` usually return `Self` + --> $DIR/new_ret_no_self.rs:51:5 + | +51 | / pub fn new() -> u32 { +52 | | unimplemented!(); +53 | | } + | |_____^ + +error: methods called `new` usually return `Self` + --> $DIR/new_ret_no_self.rs:60:5 + | +60 | / pub fn new(_: String) -> u32 { +61 | | unimplemented!(); +62 | | } + | |_____^ + +error: aborting due to 2 previous errors + -- 2.44.0