]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_builtin_macros/src/util.rs
New upstream version 1.67.1+dfsg1
[rustc.git] / compiler / rustc_builtin_macros / src / util.rs
CommitLineData
487cf647 1use rustc_ast::{AttrStyle, Attribute, MetaItem};
a2a8927a 2use rustc_expand::base::{Annotatable, ExtCtxt};
60c5eb7d 3use rustc_feature::AttributeTemplate;
a2a8927a 4use rustc_lint_defs::builtin::DUPLICATE_MACRO_ATTRIBUTES;
dfeec247
XL
5use rustc_parse::validate_attr;
6use rustc_span::Symbol;
e74abb32
XL
7
8pub 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.
22pub 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}