rust/src/misc_early.rs

56 lines
1.7 KiB
Rust
Raw Normal View History

//use rustc_front::hir::*;
use rustc::lint::*;
use syntax::ast::*;
use utils::span_lint;
2015-12-14 15:16:56 -06:00
/// **What it does:** This lint `Warn`s on struct field patterns bound to wildcards.
///
/// **Why is this bad?** Using `..` instead is shorter and leaves the focus on the fields that are actually bound.
///
/// **Known problems:** None.
///
/// **Example:** `let { a: _, b: ref b, c: _ } = ..`
2015-12-07 06:23:52 -06:00
declare_lint!(pub UNNEEDED_FIELD_PATTERN, Warn,
"Struct fields are bound to a wildcard instead of using `..`");
#[derive(Copy, Clone)]
pub struct MiscEarly;
impl LintPass for MiscEarly {
fn get_lints(&self) -> LintArray {
2015-12-07 06:23:52 -06:00
lint_array!(UNNEEDED_FIELD_PATTERN)
}
}
impl EarlyLintPass for MiscEarly {
fn check_pat(&mut self, cx: &EarlyContext, pat: &Pat) {
if let PatStruct(_, ref pfields, _) = pat.node {
let mut wilds = 0;
for field in pfields {
if field.node.pat.node == PatWild {
wilds += 1;
}
}
if !pfields.is_empty() && wilds == pfields.len() {
2015-12-07 06:23:52 -06:00
span_lint(cx, UNNEEDED_FIELD_PATTERN, pat.span,
"All the struct fields are matched to a wildcard pattern, \
consider using `..`.");
return;
}
if wilds > 0 {
for field in pfields {
if field.node.pat.node == PatWild {
2015-12-07 06:23:52 -06:00
span_lint(cx, UNNEEDED_FIELD_PATTERN, field.span,
"You matched a field with a wildcard pattern. \
Consider using `..` instead");
}
}
}
}
}
}