mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-12-20 01:54:49 +00:00
69 lines
2 KiB
Rust
69 lines
2 KiB
Rust
|
use rustc::lint::*;
|
||
|
use rustc::hir::*;
|
||
|
use utils::{span_lint_and_sugg};
|
||
|
|
||
|
/// **What it does:** Checks for redundnat field names where shorthands
|
||
|
/// can be used.
|
||
|
///
|
||
|
/// **Why is this bad?** If the field and variable names are the same,
|
||
|
/// the field name is redundant.
|
||
|
///
|
||
|
/// **Known problems:** None.
|
||
|
///
|
||
|
/// **Example:**
|
||
|
/// ```rust
|
||
|
/// let bar: u8 = 123;
|
||
|
///
|
||
|
/// struct Foo {
|
||
|
/// bar: u8,
|
||
|
/// }
|
||
|
///
|
||
|
/// let foo = Foo{ bar: bar }
|
||
|
/// ```
|
||
|
declare_lint! {
|
||
|
pub REDUNDANT_FIELD_NAMES,
|
||
|
Warn,
|
||
|
"using same name for field and variable ,where shorthand can be used"
|
||
|
}
|
||
|
|
||
|
pub struct RedundantFieldNames;
|
||
|
|
||
|
impl LintPass for RedundantFieldNames {
|
||
|
fn get_lints(&self) -> LintArray {
|
||
|
lint_array!(REDUNDANT_FIELD_NAMES)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RedundantFieldNames {
|
||
|
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
|
||
|
if let ExprStruct(_, ref fields, _) = expr.node {
|
||
|
for field in fields {
|
||
|
let name = field.name.node;
|
||
|
if let ExprPath(ref qpath) = field.expr.node {
|
||
|
if let &QPath::Resolved(_, ref path) = qpath {
|
||
|
let segments = &path.segments;
|
||
|
|
||
|
if segments.len() == 1 {
|
||
|
let expr_name = segments[0].name;
|
||
|
|
||
|
if name == expr_name {
|
||
|
span_lint_and_sugg(
|
||
|
cx,
|
||
|
REDUNDANT_FIELD_NAMES,
|
||
|
path.span,
|
||
|
"redundant field names in struct initialization",
|
||
|
&format!(
|
||
|
"replace '{0}: {0}' with '{0}'",
|
||
|
name,
|
||
|
),
|
||
|
"".to_string()
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|