mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-23 21:23:56 +00:00
Don't lint redundant_field_names
across macro boundaries
This commit is contained in:
parent
a79db2aa51
commit
ac643a278b
4 changed files with 55 additions and 24 deletions
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ struct Person {
|
|||
}
|
||||
|
||||
pub struct S {
|
||||
v: String,
|
||||
v: usize,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
@ -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() {
|
||||
|
|
|
@ -20,7 +20,7 @@ struct Person {
|
|||
}
|
||||
|
||||
pub struct S {
|
||||
v: String,
|
||||
v: usize,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue