rust/src/attrs.rs

49 lines
1.3 KiB
Rust
Raw Normal View History

2015-05-30 08:10:19 -05:00
/// checks for attributes
use rustc::plugin::Registry;
use rustc::lint::*;
use syntax::ast::*;
use syntax::ptr::P;
use syntax::codemap::Span;
use syntax::parse::token::InternedString;
declare_lint! { pub INLINE_ALWAYS, Warn,
"#[inline(always)] is usually a bad idea."}
#[derive(Copy,Clone)]
pub struct AttrPass;
impl LintPass for AttrPass {
fn get_lints(&self) -> LintArray {
lint_array!(INLINE_ALWAYS)
}
fn check_item(&mut self, cx: &Context, item: &Item) {
check_attrs(cx, &item.ident, &item.attrs)
}
fn check_impl_item(&mut self, cx: &Context, item: &ImplItem) {
check_attrs(cx, &item.ident, &item.attrs)
}
fn check_trait_item(&mut self, cx: &Context, item: &TraitItem) {
check_attrs(cx, &item.ident, &item.attrs)
}
}
fn check_attrs(cx: &Context, ident: &Ident, attrs: &[Attribute]) {
for attr in attrs {
if let MetaList(ref inline, ref values) = attr.node.value.node {
if values.len() != 1 || inline != &"inline" { continue; }
if let MetaWord(ref always) = values[0].node {
if always != &"always" { continue; }
cx.span_lint(INLINE_ALWAYS, attr.span, &format!(
"You have declared #[inline(always)] on {}. This \
is usually a bad idea. Are you sure?",
ident.as_str()));
}
}
}
}