]> git.lizzy.rs Git - rust.git/blob - src/attrs.rs
moved in_macro to (new) utils.rs
[rust.git] / src / attrs.rs
1 /// checks for attributes
2
3 use rustc::plugin::Registry;
4 use rustc::lint::*;
5 use syntax::ast::*;
6 use syntax::ptr::P;
7 use syntax::codemap::{Span, ExpnInfo};
8 use syntax::parse::token::InternedString;
9 use utils::in_macro;
10
11 declare_lint! { pub INLINE_ALWAYS, Warn,
12     "#[inline(always)] is usually a bad idea."}
13
14
15 #[derive(Copy,Clone)]
16 pub struct AttrPass;
17
18 impl LintPass for AttrPass {
19     fn get_lints(&self) -> LintArray {
20         lint_array!(INLINE_ALWAYS)
21     }
22     
23     fn check_item(&mut self, cx: &Context, item: &Item) {
24                 cx.sess().codemap().with_expn_info(item.span.expn_id, 
25                         |info| check_attrs(cx, info, &item.ident, &item.attrs))
26         }
27     
28     fn check_impl_item(&mut self, cx: &Context, item: &ImplItem) { 
29                 cx.sess().codemap().with_expn_info(item.span.expn_id, 
30                         |info| check_attrs(cx, info, &item.ident, &item.attrs))
31         }
32         
33         fn check_trait_item(&mut self, cx: &Context, item: &TraitItem) {
34                 cx.sess().codemap().with_expn_info(item.span.expn_id, 
35                         |info| check_attrs(cx, info, &item.ident, &item.attrs))
36         }
37 }
38
39 fn check_attrs(cx: &Context, info: Option<&ExpnInfo>, ident: &Ident, 
40                 attrs: &[Attribute]) {
41         if in_macro(cx, info) { return; }
42                         
43         for attr in attrs {
44                 if let MetaList(ref inline, ref values) = attr.node.value.node {
45                         if values.len() != 1 || inline != &"inline" { continue; }
46                         if let MetaWord(ref always) = values[0].node {
47                                 if always != &"always" { continue; }
48                                 cx.span_lint(INLINE_ALWAYS, attr.span, &format!(
49                                         "You have declared #[inline(always)] on {}. This \
50                                         is usually a bad idea. Are you sure?", 
51                                         ident.as_str()));
52                         }
53                 }
54         }
55 }