Ignore impls derived from macros
This commit is contained in:
parent
edd90473ec
commit
189eaa54c6
2 changed files with 29 additions and 2 deletions
|
@ -1,6 +1,6 @@
|
||||||
//! lint on inherent implementations
|
//! lint on inherent implementations
|
||||||
|
|
||||||
use crate::utils::span_lint_and_then;
|
use crate::utils::{in_macro, span_lint_and_then};
|
||||||
use rustc::hir::*;
|
use rustc::hir::*;
|
||||||
use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass};
|
use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass};
|
||||||
use rustc::{declare_tool_lint, impl_lint_pass};
|
use rustc::{declare_tool_lint, impl_lint_pass};
|
||||||
|
@ -52,7 +52,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MultipleInherentImpl {
|
||||||
if let ItemKind::Impl(_, _, _, ref generics, None, _, _) = item.kind {
|
if let ItemKind::Impl(_, _, _, ref generics, None, _, _) = item.kind {
|
||||||
// Remember for each inherent implementation encoutered its span and generics
|
// Remember for each inherent implementation encoutered its span and generics
|
||||||
// but filter out implementations that have generic params (type or lifetime)
|
// but filter out implementations that have generic params (type or lifetime)
|
||||||
if generics.params.len() == 0 {
|
// or are derived from a macro
|
||||||
|
if !in_macro(item.span) && generics.params.len() == 0 {
|
||||||
self.impls.insert(item.hir_id.owner_def_id(), item.span);
|
self.impls.insert(item.hir_id.owner_def_id(), item.span);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
26
tests/ui/crashes/inherent_impl.rs
Normal file
26
tests/ui/crashes/inherent_impl.rs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#![deny(clippy::multiple_inherent_impl)]
|
||||||
|
|
||||||
|
/// Test for https://github.com/rust-lang/rust-clippy/issues/4578
|
||||||
|
|
||||||
|
macro_rules! impl_foo {
|
||||||
|
($struct:ident) => {
|
||||||
|
impl $struct {
|
||||||
|
fn foo() {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! impl_bar {
|
||||||
|
($struct:ident) => {
|
||||||
|
impl $struct {
|
||||||
|
fn bar() {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyStruct;
|
||||||
|
|
||||||
|
impl_foo!(MyStruct);
|
||||||
|
impl_bar!(MyStruct);
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue