mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-30 16:39:26 +00:00
Don't trigger use_self in macros
This commit is contained in:
parent
bb40db7adc
commit
da65d8166f
5 changed files with 63 additions and 60 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue