Skip to content

Commit

Permalink
Don't trigger use_self in macros
Browse files Browse the repository at this point in the history
  • Loading branch information
flip1995 committed Feb 10, 2021
1 parent bb40db7 commit da65d81
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 60 deletions.
7 changes: 3 additions & 4 deletions clippy_lints/src/use_self.rs
@@ -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;
Expand All @@ -13,7 +13,6 @@ use rustc_hir::{
};
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};
Expand Down Expand Up @@ -232,7 +231,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
}

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)
Expand Down Expand Up @@ -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;
}

Expand Down
12 changes: 12 additions & 0 deletions tests/ui/auxiliary/proc_macro_derive.rs
Expand Up @@ -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
}
}
}
}
13 changes: 10 additions & 3 deletions tests/ui/use_self.fixed
@@ -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 {
Expand Down Expand Up @@ -109,17 +113,20 @@ mod tuple_structs {
mod macros {
macro_rules! use_self_expand {
() => {
fn new() -> Self {
Self {}
fn new() -> Foo {
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 {
Expand Down
9 changes: 8 additions & 1 deletion tests/ui/use_self.rs
@@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
82 changes: 30 additions & 52 deletions tests/ui/use_self.stderr
@@ -1,200 +1,178 @@
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`
|
= 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

0 comments on commit da65d81

Please sign in to comment.