diff --git a/Cargo.toml b/Cargo.toml index 802e7733985..36457023d92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,7 @@ lazy_static = "1.0" serde_derive = "1.0" clippy-mini-macro-test = { version = "0.2", path = "mini-macro" } serde = "1.0" +derive-new = "0.5" [features] debugging = [] diff --git a/clippy_lints/src/redundant_field_names.rs b/clippy_lints/src/redundant_field_names.rs index 6775129f9df..a63447575ef 100644 --- a/clippy_lints/src/redundant_field_names.rs +++ b/clippy_lints/src/redundant_field_names.rs @@ -1,6 +1,6 @@ use rustc::lint::*; use rustc::hir::*; -use utils::{is_range_expression, match_var, span_lint_and_sugg}; +use utils::{in_macro, is_range_expression, match_var, span_lint_and_sugg}; /// **What it does:** Checks for fields in struct literals where shorthands /// could be used. @@ -36,10 +36,10 @@ impl LintPass for RedundantFieldNames { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RedundantFieldNames { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { - // Do not care about range expressions. - // They could have redundant field name when desugared to structs. - // e.g. `start..end` is desugared to `Range { start: start, end: end }` - if is_range_expression(expr.span) { + // Ignore all macros including range expressions. + // They can have redundant field names when expanded. + // e.g. range expression `start..end` is desugared to `Range { start: start, end: end }` + if in_macro(expr.span) || is_range_expression(expr.span) { return; } diff --git a/tests/ui/redundant_field_names.rs b/tests/ui/redundant_field_names.rs index cb49283010b..98b6e16c450 100644 --- a/tests/ui/redundant_field_names.rs +++ b/tests/ui/redundant_field_names.rs @@ -2,6 +2,9 @@ #![allow(unused_variables)] #![feature(inclusive_range, inclusive_range_syntax)] +#[macro_use] +extern crate derive_new; + use std::ops::{Range, RangeFrom, RangeTo, RangeInclusive, RangeToInclusive}; mod foo { @@ -16,6 +19,11 @@ struct Person { foo: u8, } +#[derive(new)] +pub struct S { + v: String, +} + fn main() { let gender: u8 = 42; let age = 0; diff --git a/tests/ui/redundant_field_names.stderr b/tests/ui/redundant_field_names.stderr index 40315c6ffac..91db8a5f0d1 100644 --- a/tests/ui/redundant_field_names.stderr +++ b/tests/ui/redundant_field_names.stderr @@ -1,57 +1,57 @@ error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:26:9 + --> $DIR/redundant_field_names.rs:34:9 | -26 | gender: gender, +34 | gender: gender, | ^^^^^^^^^^^^^^ help: replace it with: `gender` | = note: `-D redundant-field-names` implied by `-D warnings` error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:27:9 + --> $DIR/redundant_field_names.rs:35:9 | -27 | age: age, +35 | age: age, | ^^^^^^^^ help: replace it with: `age` error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:45:25 + --> $DIR/redundant_field_names.rs:53:25 | -45 | let _ = RangeFrom { start: start }; +53 | let _ = RangeFrom { start: start }; | ^^^^^^^^^^^^ help: replace it with: `start` error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:46:23 + --> $DIR/redundant_field_names.rs:54:23 | -46 | let _ = RangeTo { end: end }; +54 | let _ = RangeTo { end: end }; | ^^^^^^^^ help: replace it with: `end` error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:47:21 + --> $DIR/redundant_field_names.rs:55:21 | -47 | let _ = Range { start: start, end: end }; +55 | let _ = Range { start: start, end: end }; | ^^^^^^^^^^^^ help: replace it with: `start` error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:47:35 + --> $DIR/redundant_field_names.rs:55:35 | -47 | let _ = Range { start: start, end: end }; +55 | let _ = Range { start: start, end: end }; | ^^^^^^^^ help: replace it with: `end` error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:48:30 + --> $DIR/redundant_field_names.rs:56:30 | -48 | let _ = RangeInclusive { start: start, end: end }; +56 | let _ = RangeInclusive { start: start, end: end }; | ^^^^^^^^^^^^ help: replace it with: `start` error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:48:44 + --> $DIR/redundant_field_names.rs:56:44 | -48 | let _ = RangeInclusive { start: start, end: end }; +56 | let _ = RangeInclusive { start: start, end: end }; | ^^^^^^^^ help: replace it with: `end` error: redundant field names in struct initialization - --> $DIR/redundant_field_names.rs:49:32 + --> $DIR/redundant_field_names.rs:57:32 | -49 | let _ = RangeToInclusive { end: end }; +57 | let _ = RangeToInclusive { end: end }; | ^^^^^^^^ help: replace it with: `end` error: aborting due to 9 previous errors