Don't trigger use_self in macros
This commit is contained in:
parent
bb40db7adc
commit
da65d8166f
@ -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 rustc_errors::Applicability;
|
||||
@ -13,7 +13,6 @@
|
||||
};
|
||||
use rustc_lint::{LateContext, LateLintPass, LintContext};
|
||||
use rustc_middle::hir::map::Map;
|
||||
use rustc_middle::lint::in_external_macro;
|
||||
use rustc_middle::ty::{AssocKind, Ty};
|
||||
use rustc_semver::RustcVersion;
|
||||
use rustc_session::{declare_tool_lint, impl_lint_pass};
|
||||
@ -232,7 +231,7 @@ fn check_body_post(&mut self, _: &LateContext<'_>, _: &hir::Body<'_>) {
|
||||
}
|
||||
|
||||
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)
|
||||
| self.types_to_skip.contains(&hir_ty.hir_id)
|
||||
| !meets_msrv(self.msrv.as_ref(), &USE_SELF_MSRV)
|
||||
@ -274,7 +273,7 @@ fn expr_ty_matches(cx: &LateContext<'_>, expr: &Expr<'_>, self_ty: Ty<'_>) -> bo
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -41,3 +41,15 @@ fn lint() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[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
|
||||
// edition:2018
|
||||
// aux-build:proc_macro_derive.rs
|
||||
|
||||
#![warn(clippy::use_self)]
|
||||
#![allow(dead_code)]
|
||||
#![allow(clippy::should_implement_trait, clippy::upper_case_acronyms, clippy::from_over_into)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate proc_macro_derive;
|
||||
|
||||
fn main() {}
|
||||
|
||||
mod use_self {
|
||||
@ -109,8 +113,8 @@ mod tuple_structs {
|
||||
mod macros {
|
||||
macro_rules! use_self_expand {
|
||||
() => {
|
||||
fn new() -> Self {
|
||||
Self {}
|
||||
fn new() -> Foo {
|
||||
Foo {}
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -118,8 +122,11 @@ mod macros {
|
||||
struct 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 {
|
||||
|
@ -1,10 +1,14 @@
|
||||
// run-rustfix
|
||||
// edition:2018
|
||||
// aux-build:proc_macro_derive.rs
|
||||
|
||||
#![warn(clippy::use_self)]
|
||||
#![allow(dead_code)]
|
||||
#![allow(clippy::should_implement_trait, clippy::upper_case_acronyms, clippy::from_over_into)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate proc_macro_derive;
|
||||
|
||||
fn main() {}
|
||||
|
||||
mod use_self {
|
||||
@ -118,8 +122,11 @@ fn new() -> Foo {
|
||||
struct 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 {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:14:21
|
||||
--> $DIR/use_self.rs:18:21
|
||||
|
|
||||
LL | fn new() -> Foo {
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
@ -7,194 +7,172 @@ LL | fn new() -> Foo {
|
||||
= note: `-D clippy::use-self` implied by `-D warnings`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:15:13
|
||||
--> $DIR/use_self.rs:19:13
|
||||
|
|
||||
LL | Foo {}
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:17:22
|
||||
--> $DIR/use_self.rs:21:22
|
||||
|
|
||||
LL | fn test() -> Foo {
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:18:13
|
||||
--> $DIR/use_self.rs:22:13
|
||||
|
|
||||
LL | Foo::new()
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:23:25
|
||||
--> $DIR/use_self.rs:27:25
|
||||
|
|
||||
LL | fn default() -> Foo {
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:24:13
|
||||
--> $DIR/use_self.rs:28:13
|
||||
|
|
||||
LL | Foo::new()
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
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> {
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
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> {
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:104:13
|
||||
--> $DIR/use_self.rs:108:13
|
||||
|
|
||||
LL | TS(0)
|
||||
| ^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:112:25
|
||||
|
|
||||
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
|
||||
--> $DIR/use_self.rs:143:29
|
||||
|
|
||||
LL | fn bar() -> Bar {
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:137:21
|
||||
--> $DIR/use_self.rs:144:21
|
||||
|
|
||||
LL | Bar { foo: Foo {} }
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:148:21
|
||||
--> $DIR/use_self.rs:155:21
|
||||
|
|
||||
LL | fn baz() -> Foo {
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:149:13
|
||||
--> $DIR/use_self.rs:156:13
|
||||
|
|
||||
LL | Foo {}
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:166:21
|
||||
--> $DIR/use_self.rs:173:21
|
||||
|
|
||||
LL | let _ = Enum::B(42);
|
||||
| ^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:167:21
|
||||
--> $DIR/use_self.rs:174:21
|
||||
|
|
||||
LL | let _ = Enum::C { field: true };
|
||||
| ^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:168:21
|
||||
--> $DIR/use_self.rs:175:21
|
||||
|
|
||||
LL | let _ = Enum::A;
|
||||
| ^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:210:13
|
||||
--> $DIR/use_self.rs:217:13
|
||||
|
|
||||
LL | nested::A::fun_1();
|
||||
| ^^^^^^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:211:13
|
||||
--> $DIR/use_self.rs:218:13
|
||||
|
|
||||
LL | nested::A::A;
|
||||
| ^^^^^^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:213:13
|
||||
--> $DIR/use_self.rs:220:13
|
||||
|
|
||||
LL | nested::A {};
|
||||
| ^^^^^^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:232:13
|
||||
--> $DIR/use_self.rs:239:13
|
||||
|
|
||||
LL | TestStruct::from_something()
|
||||
| ^^^^^^^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:246:25
|
||||
--> $DIR/use_self.rs:253:25
|
||||
|
|
||||
LL | async fn g() -> S {
|
||||
| ^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:247:13
|
||||
--> $DIR/use_self.rs:254:13
|
||||
|
|
||||
LL | S {}
|
||||
| ^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:251:16
|
||||
--> $DIR/use_self.rs:258:16
|
||||
|
|
||||
LL | &p[S::A..S::B]
|
||||
| ^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:251:22
|
||||
--> $DIR/use_self.rs:258:22
|
||||
|
|
||||
LL | &p[S::A..S::B]
|
||||
| ^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:274:29
|
||||
--> $DIR/use_self.rs:281:29
|
||||
|
|
||||
LL | fn foo(value: T) -> Foo<T> {
|
||||
| ^^^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:275:13
|
||||
--> $DIR/use_self.rs:282:13
|
||||
|
|
||||
LL | Foo { value }
|
||||
| ^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:312:21
|
||||
--> $DIR/use_self.rs:319:21
|
||||
|
|
||||
LL | type From = T::From;
|
||||
| ^^^^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:313:19
|
||||
--> $DIR/use_self.rs:320:19
|
||||
|
|
||||
LL | type To = T::To;
|
||||
| ^^^^^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: unnecessary structure name repetition
|
||||
--> $DIR/use_self.rs:450:13
|
||||
--> $DIR/use_self.rs:457:13
|
||||
|
|
||||
LL | A::new::<submod::B>(submod::B {})
|
||||
| ^ help: use the applicable keyword: `Self`
|
||||
|
||||
error: aborting due to 31 previous errors
|
||||
error: aborting due to 29 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user