1 use rustc_ast
::{AttrStyle, Attribute, MetaItem}
;
2 use rustc_expand
::base
::{Annotatable, ExtCtxt}
;
3 use rustc_feature
::AttributeTemplate
;
4 use rustc_lint_defs
::builtin
::DUPLICATE_MACRO_ATTRIBUTES
;
5 use rustc_parse
::validate_attr
;
6 use rustc_span
::Symbol
;
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.
10 let template
= AttributeTemplate { word: true, ..Default::default() }
;
11 validate_attr
::check_builtin_meta_item(
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
),
38 if let Some(attrs
) = attrs
{
39 if let Some(attr
) = ecx
.sess
.find_by_name(attrs
, name
) {
40 ecx
.parse_sess().buffer_lint(
41 DUPLICATE_MACRO_ATTRIBUTES
,
43 ecx
.current_expansion
.lint_node_id
,
44 "duplicated attribute",