Don't trigger use_self in macros

This commit is contained in:
flip1995 2021-01-17 19:09:24 +01:00 committed by flip1995
parent bb40db7adc
commit da65d8166f
No known key found for this signature in database
GPG key ID: 1CA0DF2AF59D68A5
5 changed files with 63 additions and 60 deletions

View file

@ -1,4 +1,4 @@
use crate::utils::{meets_msrv, qpath_res, snippet_opt, span_lint_and_sugg}; use crate::utils::{in_macro, meets_msrv, qpath_res, snippet_opt, span_lint_and_sugg};
use if_chain::if_chain; use if_chain::if_chain;
use rustc_errors::Applicability; use rustc_errors::Applicability;
@ -13,7 +13,6 @@ use rustc_hir::{
}; };
use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::hir::map::Map; use rustc_middle::hir::map::Map;
use rustc_middle::lint::in_external_macro;
use rustc_middle::ty::{AssocKind, Ty}; use rustc_middle::ty::{AssocKind, Ty};
use rustc_semver::RustcVersion; use rustc_semver::RustcVersion;
use rustc_session::{declare_tool_lint, impl_lint_pass}; use rustc_session::{declare_tool_lint, impl_lint_pass};
@ -232,7 +231,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
} }
fn check_ty(&mut self, cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>) { fn check_ty(&mut self, cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>) {
if in_external_macro(cx.sess(), hir_ty.span) if in_macro(hir_ty.span)
| in_impl(cx, hir_ty) | in_impl(cx, hir_ty)
| self.types_to_skip.contains(&hir_ty.hir_id) | self.types_to_skip.contains(&hir_ty.hir_id)
| !meets_msrv(self.msrv.as_ref(), &USE_SELF_MSRV) | !meets_msrv(self.msrv.as_ref(), &USE_SELF_MSRV)
@ -274,7 +273,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
} }
} }
if in_external_macro(cx.sess(), expr.span) | !meets_msrv(self.msrv.as_ref(), &USE_SELF_MSRV) { if in_macro(expr.span) | !meets_msrv(self.msrv.as_ref(), &USE_SELF_MSRV) {
return; return;
} }

View file

@ -41,3 +41,15 @@ pub fn derive_foo(_input: TokenStream) -> TokenStream {
} }
} }
} }
#[proc_macro_derive(StructAUseSelf)]
pub fn derive_use_self(_input: TokenStream) -> proc_macro::TokenStream {
quote! {
struct A;
impl A {
fn new() -> A {
A
}
}
}
}

View file

@ -1,10 +1,14 @@
// run-rustfix // run-rustfix
// edition:2018 // edition:2018
// aux-build:proc_macro_derive.rs
#![warn(clippy::use_self)] #![warn(clippy::use_self)]
#![allow(dead_code)] #![allow(dead_code)]
#![allow(clippy::should_implement_trait, clippy::upper_case_acronyms, clippy::from_over_into)] #![allow(clippy::should_implement_trait, clippy::upper_case_acronyms, clippy::from_over_into)]
#[macro_use]
extern crate proc_macro_derive;
fn main() {} fn main() {}
mod use_self { mod use_self {
@ -109,8 +113,8 @@ mod tuple_structs {
mod macros { mod macros {
macro_rules! use_self_expand { macro_rules! use_self_expand {
() => { () => {
fn new() -> Self { fn new() -> Foo {
Self {} Foo {}
} }
}; };
} }
@ -118,8 +122,11 @@ mod macros {
struct Foo {} struct Foo {}
impl Foo { impl Foo {
use_self_expand!(); // Should lint in local macros use_self_expand!(); // Should not lint in local macros
} }
#[derive(StructAUseSelf)] // Should not lint in derives
struct A;
} }
mod nesting { mod nesting {

View file

@ -1,10 +1,14 @@
// run-rustfix // run-rustfix
// edition:2018 // edition:2018
// aux-build:proc_macro_derive.rs
#![warn(clippy::use_self)] #![warn(clippy::use_self)]
#![allow(dead_code)] #![allow(dead_code)]
#![allow(clippy::should_implement_trait, clippy::upper_case_acronyms, clippy::from_over_into)] #![allow(clippy::should_implement_trait, clippy::upper_case_acronyms, clippy::from_over_into)]
#[macro_use]
extern crate proc_macro_derive;
fn main() {} fn main() {}
mod use_self { mod use_self {
@ -118,8 +122,11 @@ mod macros {
struct Foo {} struct Foo {}
impl Foo { impl Foo {
use_self_expand!(); // Should lint in local macros use_self_expand!(); // Should not lint in local macros
} }
#[derive(StructAUseSelf)] // Should not lint in derives
struct A;
} }
mod nesting { mod nesting {

View file

@ -1,5 +1,5 @@
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:14:21 --> $DIR/use_self.rs:18:21
| |
LL | fn new() -> Foo { LL | fn new() -> Foo {
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
@ -7,194 +7,172 @@ LL | fn new() -> Foo {
= note: `-D clippy::use-self` implied by `-D warnings` = note: `-D clippy::use-self` implied by `-D warnings`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:15:13 --> $DIR/use_self.rs:19:13
| |
LL | Foo {} LL | Foo {}
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:17:22 --> $DIR/use_self.rs:21:22
| |
LL | fn test() -> Foo { LL | fn test() -> Foo {
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:18:13 --> $DIR/use_self.rs:22:13
| |
LL | Foo::new() LL | Foo::new()
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:23:25 --> $DIR/use_self.rs:27:25
| |
LL | fn default() -> Foo { LL | fn default() -> Foo {
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:24:13 --> $DIR/use_self.rs:28:13
| |
LL | Foo::new() LL | Foo::new()
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:89:24 --> $DIR/use_self.rs:93:24
| |
LL | fn bad(foos: &[Foo]) -> impl Iterator<Item = &Foo> { LL | fn bad(foos: &[Foo]) -> impl Iterator<Item = &Foo> {
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:89:55 --> $DIR/use_self.rs:93:55
| |
LL | fn bad(foos: &[Foo]) -> impl Iterator<Item = &Foo> { LL | fn bad(foos: &[Foo]) -> impl Iterator<Item = &Foo> {
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:104:13 --> $DIR/use_self.rs:108:13
| |
LL | TS(0) LL | TS(0)
| ^^ help: use the applicable keyword: `Self` | ^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:112:25 --> $DIR/use_self.rs:143:29
|
LL | fn new() -> Foo {
| ^^^ help: use the applicable keyword: `Self`
...
LL | use_self_expand!(); // Should lint in local macros
| ------------------- in this macro invocation
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
error: unnecessary structure name repetition
--> $DIR/use_self.rs:113:17
|
LL | Foo {}
| ^^^ help: use the applicable keyword: `Self`
...
LL | use_self_expand!(); // Should lint in local macros
| ------------------- in this macro invocation
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
error: unnecessary structure name repetition
--> $DIR/use_self.rs:136:29
| |
LL | fn bar() -> Bar { LL | fn bar() -> Bar {
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:137:21 --> $DIR/use_self.rs:144:21
| |
LL | Bar { foo: Foo {} } LL | Bar { foo: Foo {} }
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:148:21 --> $DIR/use_self.rs:155:21
| |
LL | fn baz() -> Foo { LL | fn baz() -> Foo {
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:149:13 --> $DIR/use_self.rs:156:13
| |
LL | Foo {} LL | Foo {}
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:166:21 --> $DIR/use_self.rs:173:21
| |
LL | let _ = Enum::B(42); LL | let _ = Enum::B(42);
| ^^^^ help: use the applicable keyword: `Self` | ^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:167:21 --> $DIR/use_self.rs:174:21
| |
LL | let _ = Enum::C { field: true }; LL | let _ = Enum::C { field: true };
| ^^^^ help: use the applicable keyword: `Self` | ^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:168:21 --> $DIR/use_self.rs:175:21
| |
LL | let _ = Enum::A; LL | let _ = Enum::A;
| ^^^^ help: use the applicable keyword: `Self` | ^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:210:13 --> $DIR/use_self.rs:217:13
| |
LL | nested::A::fun_1(); LL | nested::A::fun_1();
| ^^^^^^^^^ help: use the applicable keyword: `Self` | ^^^^^^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:211:13 --> $DIR/use_self.rs:218:13
| |
LL | nested::A::A; LL | nested::A::A;
| ^^^^^^^^^ help: use the applicable keyword: `Self` | ^^^^^^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:213:13 --> $DIR/use_self.rs:220:13
| |
LL | nested::A {}; LL | nested::A {};
| ^^^^^^^^^ help: use the applicable keyword: `Self` | ^^^^^^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:232:13 --> $DIR/use_self.rs:239:13
| |
LL | TestStruct::from_something() LL | TestStruct::from_something()
| ^^^^^^^^^^ help: use the applicable keyword: `Self` | ^^^^^^^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:246:25 --> $DIR/use_self.rs:253:25
| |
LL | async fn g() -> S { LL | async fn g() -> S {
| ^ help: use the applicable keyword: `Self` | ^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:247:13 --> $DIR/use_self.rs:254:13
| |
LL | S {} LL | S {}
| ^ help: use the applicable keyword: `Self` | ^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:251:16 --> $DIR/use_self.rs:258:16
| |
LL | &p[S::A..S::B] LL | &p[S::A..S::B]
| ^ help: use the applicable keyword: `Self` | ^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:251:22 --> $DIR/use_self.rs:258:22
| |
LL | &p[S::A..S::B] LL | &p[S::A..S::B]
| ^ help: use the applicable keyword: `Self` | ^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:274:29 --> $DIR/use_self.rs:281:29
| |
LL | fn foo(value: T) -> Foo<T> { LL | fn foo(value: T) -> Foo<T> {
| ^^^^^^ help: use the applicable keyword: `Self` | ^^^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:275:13 --> $DIR/use_self.rs:282:13
| |
LL | Foo { value } LL | Foo { value }
| ^^^ help: use the applicable keyword: `Self` | ^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:312:21 --> $DIR/use_self.rs:319:21
| |
LL | type From = T::From; LL | type From = T::From;
| ^^^^^^^ help: use the applicable keyword: `Self` | ^^^^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:313:19 --> $DIR/use_self.rs:320:19
| |
LL | type To = T::To; LL | type To = T::To;
| ^^^^^ help: use the applicable keyword: `Self` | ^^^^^ help: use the applicable keyword: `Self`
error: unnecessary structure name repetition error: unnecessary structure name repetition
--> $DIR/use_self.rs:450:13 --> $DIR/use_self.rs:457:13
| |
LL | A::new::<submod::B>(submod::B {}) LL | A::new::<submod::B>(submod::B {})
| ^ help: use the applicable keyword: `Self` | ^ help: use the applicable keyword: `Self`
error: aborting due to 31 previous errors error: aborting due to 29 previous errors