rust/src/misc_early.rs

81 lines
3.0 KiB
Rust
Raw Normal View History

//use rustc_front::hir::*;
use rustc::lint::*;
use syntax::ast::*;
2016-01-01 22:52:13 -06:00
use utils::{span_lint, span_help_and_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) {
2016-01-01 22:52:13 -06:00
if let PatStruct(ref npat, ref pfields, _) = pat.node {
let mut wilds = 0;
2016-01-01 22:52:13 -06:00
let type_name = match npat.segments.last() {
Some(elem) => format!("{}", elem.identifier.name),
None => String::new(),
};
for field in pfields {
if field.node.pat.node == PatWild {
wilds += 1;
}
}
if !pfields.is_empty() && wilds == pfields.len() {
2016-01-01 22:52:13 -06:00
span_help_and_lint(cx, UNNEEDED_FIELD_PATTERN, pat.span,
"All the struct fields are matched to a wildcard pattern, \
consider using `..`.",
&format!("Try with `{} {{ .. }}` instead",
type_name));
return;
}
if wilds > 0 {
2016-01-01 22:52:13 -06:00
let mut normal = vec!();
for field in pfields {
if field.node.pat.node != PatWild {
if let Ok(n) = cx.sess().codemap().span_to_snippet(field.span) {
normal.push(n);
}
}
}
for field in pfields {
if field.node.pat.node == PatWild {
2016-01-01 22:52:13 -06:00
wilds -= 1;
if wilds > 0 {
span_lint(cx, UNNEEDED_FIELD_PATTERN, field.span,
"You matched a field with a wildcard pattern. \
Consider using `..` instead");
} else {
span_help_and_lint(cx, UNNEEDED_FIELD_PATTERN, field.span,
"You matched a field with a wildcard pattern. \
Consider using `..` instead",
&format!("Try with `{} {{ {}, .. }}`",
type_name,
normal[..].join(", ")));
}
}
}
}
}
}
}