mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-09-20 22:51:58 +00:00
Make redundant_field_name
not care range expressions
Hand-written `Range` struct family are treated normally.
This commit is contained in:
parent
5b48b03375
commit
cdb60c6547
4 changed files with 72 additions and 41 deletions
|
@ -1,8 +1,6 @@
|
|||
use syntax::ast::Name;
|
||||
use rustc::lint::*;
|
||||
use rustc::hir::*;
|
||||
use utils::{match_qpath, match_var, span_lint_and_sugg};
|
||||
use utils::paths;
|
||||
use utils::{is_range_expression, match_var, span_lint_and_sugg};
|
||||
|
||||
/// **What it does:** Checks for fields in struct literals where shorthands
|
||||
/// could be used.
|
||||
|
@ -42,7 +40,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RedundantFieldNames {
|
|||
for field in fields {
|
||||
let name = field.name.node;
|
||||
|
||||
if is_range_struct_field(path, &name) {
|
||||
// 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) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -60,27 +61,3 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RedundantFieldNames {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// ```rust
|
||||
/// let start = 0;
|
||||
/// let _ = start..;
|
||||
///
|
||||
/// let end = 0;
|
||||
/// let _ = ..end;
|
||||
///
|
||||
/// let _ = start..end;
|
||||
/// ```
|
||||
fn is_range_struct_field(path: &QPath, name: &Name) -> bool {
|
||||
match name.as_str().as_ref() {
|
||||
"start" => {
|
||||
match_qpath(path, &paths::RANGE_STD) || match_qpath(path, &paths::RANGE_FROM_STD)
|
||||
|| match_qpath(path, &paths::RANGE_INCLUSIVE_STD)
|
||||
},
|
||||
"end" => {
|
||||
match_qpath(path, &paths::RANGE_STD) || match_qpath(path, &paths::RANGE_TO_STD)
|
||||
|| match_qpath(path, &paths::RANGE_INCLUSIVE_STD)
|
||||
|| match_qpath(path, &paths::RANGE_TO_INCLUSIVE_STD)
|
||||
},
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,6 +64,16 @@ pub fn in_macro(span: Span) -> bool {
|
|||
})
|
||||
}
|
||||
|
||||
/// Returns true if `expn_info` was expanded by range expressions.
|
||||
pub fn is_range_expression(span: Span) -> bool {
|
||||
span.ctxt().outer().expn_info().map_or(false, |info| {
|
||||
match info.callee.format {
|
||||
ExpnFormat::CompilerDesugaring(CompilerDesugaringKind::DotFill) => true,
|
||||
_ => false,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/// Returns true if the macro that expanded the crate was outside of the
|
||||
/// current crate or was a
|
||||
/// compiler plugin.
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#![warn(redundant_field_names)]
|
||||
#![allow(unused_variables)]
|
||||
#![feature(inclusive_range,inclusive_range_syntax)]
|
||||
#![feature(inclusive_range, inclusive_range_syntax)]
|
||||
|
||||
use std::ops::{Range, RangeFrom, RangeTo, RangeInclusive, RangeToInclusive};
|
||||
|
||||
mod foo {
|
||||
pub const BAR: u8 = 0;
|
||||
|
@ -29,7 +31,7 @@ fn main() {
|
|||
foo: foo::BAR, //should be ok
|
||||
};
|
||||
|
||||
// Range syntax
|
||||
// Range expressions
|
||||
let (start, end) = (0, 0);
|
||||
|
||||
let _ = start..;
|
||||
|
@ -39,10 +41,10 @@ fn main() {
|
|||
let _ = ..=end;
|
||||
let _ = start..=end;
|
||||
|
||||
// TODO: the following should be linted
|
||||
let _ = ::std::ops::RangeFrom { start: start };
|
||||
let _ = ::std::ops::RangeTo { end: end };
|
||||
let _ = ::std::ops::Range { start: start, end: end };
|
||||
let _ = ::std::ops::RangeInclusive { start: start, end: end };
|
||||
let _ = ::std::ops::RangeToInclusive { end: end };
|
||||
// hand-written Range family structs are linted
|
||||
let _ = RangeFrom { start: start };
|
||||
let _ = RangeTo { end: end };
|
||||
let _ = Range { start: start, end: end };
|
||||
let _ = RangeInclusive { start: start, end: end };
|
||||
let _ = RangeToInclusive { end: end };
|
||||
}
|
||||
|
|
|
@ -1,16 +1,58 @@
|
|||
error: redundant field names in struct initialization
|
||||
--> $DIR/redundant_field_names.rs:24:9
|
||||
--> $DIR/redundant_field_names.rs:26:9
|
||||
|
|
||||
24 | gender: gender,
|
||||
26 | 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:25:9
|
||||
--> $DIR/redundant_field_names.rs:27:9
|
||||
|
|
||||
25 | age: age,
|
||||
27 | age: age,
|
||||
| ^^^^^^^^ help: replace it with: `age`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: redundant field names in struct initialization
|
||||
--> $DIR/redundant_field_names.rs:45:25
|
||||
|
|
||||
45 | let _ = RangeFrom { start: start };
|
||||
| ^^^^^^^^^^^^ help: replace it with: `start`
|
||||
|
||||
error: redundant field names in struct initialization
|
||||
--> $DIR/redundant_field_names.rs:46:23
|
||||
|
|
||||
46 | let _ = RangeTo { end: end };
|
||||
| ^^^^^^^^ help: replace it with: `end`
|
||||
|
||||
error: redundant field names in struct initialization
|
||||
--> $DIR/redundant_field_names.rs:47:21
|
||||
|
|
||||
47 | 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
|
||||
|
|
||||
47 | 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
|
||||
|
|
||||
48 | 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
|
||||
|
|
||||
48 | 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
|
||||
|
|
||||
49 | let _ = RangeToInclusive { end: end };
|
||||
| ^^^^^^^^ help: replace it with: `end`
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
|
||||
|
|
Loading…
Reference in a new issue