]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_builtin_macros/src/util.rs
Rollup merge of #104952 - jyn514:setup, r=Mark-Simulacrum
[rust.git] / compiler / rustc_builtin_macros / src / util.rs
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;
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.
10     let template = AttributeTemplate { word: true, ..Default::default() };
11     validate_attr::check_builtin_meta_item(
12         &ecx.sess.parse_sess,
13         &meta_item,
14         AttrStyle::Outer,
15         name,
16         template,
17     );
18 }
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(&param.attrs),
33         Annotatable::Param(param) => Some(&param.attrs),
34         Annotatable::FieldDef(def) => Some(&def.attrs),
35         Annotatable::Variant(variant) => Some(&variant.attrs),
36         _ => None,
37     };
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,
42                 attr.span,
43                 ecx.current_expansion.lint_node_id,
44                 "duplicated attribute",
45             );
46         }
47     }
48 }