Skip to content

Commit

Permalink
Auto merge of rust-lang#12429 - Alexendoo:redundant-field-names-macro…
Browse files Browse the repository at this point in the history
…-ctxt, r=Manishearth

Don't lint `redundant_field_names` across macro boundaries

Fixes rust-lang#12426

The `field.span.eq_ctxt(field.ident.span)` addition is the relevant line for the bugfix

The current implementation checks that the field's name and the path are in the same context by comparing the idents, but not that the two are in the same context as the entire field itself, so in local macros `SomeStruct { $ident: $ident }` would get linted

changelog: none
  • Loading branch information
bors committed Mar 7, 2024
2 parents a79db2a + ac643a2 commit ba80e06
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 24 deletions.
34 changes: 16 additions & 18 deletions clippy_lints/src/redundant_field_names.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,24 +59,22 @@ impl EarlyLintPass for RedundantFieldNames {
}
if let ExprKind::Struct(ref se) = expr.kind {
for field in &se.fields {
if field.is_shorthand {
continue;
}
if let ExprKind::Path(None, path) = &field.expr.kind {
if path.segments.len() == 1
&& path.segments[0].ident == field.ident
&& path.segments[0].args.is_none()
{
span_lint_and_sugg(
cx,
REDUNDANT_FIELD_NAMES,
field.span,
"redundant field names in struct initialization",
"replace it with",
field.ident.to_string(),
Applicability::MachineApplicable,
);
}
if !field.is_shorthand
&& let ExprKind::Path(None, path) = &field.expr.kind
&& let [segment] = path.segments.as_slice()
&& segment.args.is_none()
&& segment.ident == field.ident
&& field.span.eq_ctxt(field.ident.span)
{
span_lint_and_sugg(
cx,
REDUNDANT_FIELD_NAMES,
field.span,
"redundant field names in struct initialization",
"replace it with",
field.ident.to_string(),
Applicability::MachineApplicable,
);
}
}
}
Expand Down
15 changes: 13 additions & 2 deletions tests/ui/redundant_field_names.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ struct Person {
}

pub struct S {
v: String,
v: usize,
}

fn main() {
Expand Down Expand Up @@ -59,11 +59,22 @@ fn main() {
let _ = RangeToInclusive { end };

external! {
let v = String::new();
let v = 1;
let _ = S {
v: v
};
}

let v = 2;
macro_rules! internal {
($i:ident) => {
let _ = S { v };
let _ = S { $i: v };
let _ = S { v: $i };
let _ = S { $i: $i };
};
}
internal!(v);
}

fn issue_3476() {
Expand Down
15 changes: 13 additions & 2 deletions tests/ui/redundant_field_names.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ struct Person {
}

pub struct S {
v: String,
v: usize,
}

fn main() {
Expand Down Expand Up @@ -59,11 +59,22 @@ fn main() {
let _ = RangeToInclusive { end: end };

external! {
let v = String::new();
let v = 1;
let _ = S {
v: v
};
}

let v = 2;
macro_rules! internal {
($i:ident) => {
let _ = S { v: v };
let _ = S { $i: v };
let _ = S { v: $i };
let _ = S { $i: $i };
};
}
internal!(v);
}

fn issue_3476() {
Expand Down
15 changes: 13 additions & 2 deletions tests/ui/redundant_field_names.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,21 @@ LL | let _ = RangeToInclusive { end: end };
| ^^^^^^^^ help: replace it with: `end`

error: redundant field names in struct initialization
--> tests/ui/redundant_field_names.rs:88:25
--> tests/ui/redundant_field_names.rs:71:25
|
LL | let _ = S { v: v };
| ^^^^ help: replace it with: `v`
...
LL | internal!(v);
| ------------ in this macro invocation
|
= note: this error originates in the macro `internal` (in Nightly builds, run with -Z macro-backtrace for more info)

error: redundant field names in struct initialization
--> tests/ui/redundant_field_names.rs:99:25
|
LL | let _ = RangeFrom { start: start };
| ^^^^^^^^^^^^ help: replace it with: `start`

error: aborting due to 8 previous errors
error: aborting due to 9 previous errors

0 comments on commit ba80e06

Please sign in to comment.