]>
Commit | Line | Data |
---|---|---|
353b0b11 | 1 | use rustc_ast::{attr, AttrStyle, Attribute, MetaItem}; |
a2a8927a | 2 | use rustc_expand::base::{Annotatable, ExtCtxt}; |
60c5eb7d | 3 | use rustc_feature::AttributeTemplate; |
a2a8927a | 4 | use rustc_lint_defs::builtin::DUPLICATE_MACRO_ATTRIBUTES; |
dfeec247 XL |
5 | use rustc_parse::validate_attr; |
6 | use rustc_span::Symbol; | |
e74abb32 XL |
7 | |
8 | pub fn check_builtin_macro_attribute(ecx: &ExtCtxt<'_>, meta_item: &MetaItem, name: Symbol) { | |
9 | // All the built-in macro attributes are "words" at the moment. | |
ba9703b0 | 10 | let template = AttributeTemplate { word: true, ..Default::default() }; |
487cf647 FG |
11 | validate_attr::check_builtin_meta_item( |
12 | &ecx.sess.parse_sess, | |
13 | &meta_item, | |
14 | AttrStyle::Outer, | |
15 | name, | |
16 | template, | |
17 | ); | |
e74abb32 | 18 | } |
a2a8927a XL |
19 | |
20 | /// Emit a warning if the item is annotated with the given attribute. This is used to diagnose when | |
21 | /// an attribute may have been mistakenly duplicated. | |
22 | pub fn warn_on_duplicate_attribute(ecx: &ExtCtxt<'_>, item: &Annotatable, name: Symbol) { | |
23 | let attrs: Option<&[Attribute]> = match item { | |
24 | Annotatable::Item(item) => Some(&item.attrs), | |
25 | Annotatable::TraitItem(item) => Some(&item.attrs), | |
26 | Annotatable::ImplItem(item) => Some(&item.attrs), | |
27 | Annotatable::ForeignItem(item) => Some(&item.attrs), | |
28 | Annotatable::Expr(expr) => Some(&expr.attrs), | |
29 | Annotatable::Arm(arm) => Some(&arm.attrs), | |
30 | Annotatable::ExprField(field) => Some(&field.attrs), | |
31 | Annotatable::PatField(field) => Some(&field.attrs), | |
32 | Annotatable::GenericParam(param) => Some(¶m.attrs), | |
33 | Annotatable::Param(param) => Some(¶m.attrs), | |
34 | Annotatable::FieldDef(def) => Some(&def.attrs), | |
35 | Annotatable::Variant(variant) => Some(&variant.attrs), | |
36 | _ => None, | |
37 | }; | |
38 | if let Some(attrs) = attrs { | |
353b0b11 | 39 | if let Some(attr) = attr::find_by_name(attrs, name) { |
a2a8927a XL |
40 | ecx.parse_sess().buffer_lint( |
41 | DUPLICATE_MACRO_ATTRIBUTES, | |
42 | attr.span, | |
43 | ecx.current_expansion.lint_node_id, | |
44 | "duplicated attribute", | |
45 | ); | |
46 | } | |
47 | } | |
48 | } |