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;
|
2015-06-01 08:09:17 -05:00
|
|
|
use syntax::codemap::{Span, ExpnInfo};
|
2015-05-30 08:10:19 -05:00
|
|
|
use syntax::parse::token::InternedString;
|
2015-06-01 15:30:34 -05:00
|
|
|
use utils::in_macro;
|
2015-05-30 08:10:19 -05:00
|
|
|
|
|
|
|
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) {
|
2015-06-01 08:09:17 -05:00
|
|
|
cx.sess().codemap().with_expn_info(item.span.expn_id,
|
|
|
|
|info| check_attrs(cx, info, &item.ident, &item.attrs))
|
2015-05-30 08:10:19 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn check_impl_item(&mut self, cx: &Context, item: &ImplItem) {
|
2015-06-01 08:09:17 -05:00
|
|
|
cx.sess().codemap().with_expn_info(item.span.expn_id,
|
|
|
|
|info| check_attrs(cx, info, &item.ident, &item.attrs))
|
2015-05-30 08:10:19 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn check_trait_item(&mut self, cx: &Context, item: &TraitItem) {
|
2015-06-01 08:09:17 -05:00
|
|
|
cx.sess().codemap().with_expn_info(item.span.expn_id,
|
|
|
|
|info| check_attrs(cx, info, &item.ident, &item.attrs))
|
2015-05-30 08:10:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-01 08:09:17 -05:00
|
|
|
fn check_attrs(cx: &Context, info: Option<&ExpnInfo>, ident: &Ident,
|
|
|
|
attrs: &[Attribute]) {
|
|
|
|
if in_macro(cx, info) { return; }
|
|
|
|
|
2015-05-30 08:10:19 -05:00
|
|
|
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()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|