rustc_attr_parsing/attributes/
transparency.rs

1use rustc_attr_data_structures::AttributeKind;
2use rustc_span::hygiene::Transparency;
3use rustc_span::sym;
4
5use super::{AcceptContext, SingleAttributeParser};
6use crate::parser::ArgParser;
7
8pub(crate) struct TransparencyParser;
9
10// FIXME(jdonszelmann): make these proper diagnostics
11#[allow(rustc::untranslatable_diagnostic)]
12#[allow(rustc::diagnostic_outside_of_impl)]
13impl SingleAttributeParser for TransparencyParser {
14    const PATH: &'static [rustc_span::Symbol] = &[sym::rustc_macro_transparency];
15
16    fn on_duplicate(cx: &crate::context::AcceptContext<'_>, first_span: rustc_span::Span) {
17        cx.dcx().span_err(vec![first_span, cx.attr_span], "multiple macro transparency attributes");
18    }
19
20    fn convert(cx: &AcceptContext<'_>, args: &ArgParser<'_>) -> Option<AttributeKind> {
21        match args.name_value().and_then(|nv| nv.value_as_str()) {
22            Some(sym::transparent) => Some(Transparency::Transparent),
23            Some(sym::semitransparent) => Some(Transparency::SemiTransparent),
24            Some(sym::opaque) => Some(Transparency::Opaque),
25            Some(other) => {
26                cx.dcx().span_err(cx.attr_span, format!("unknown macro transparency: `{other}`"));
27                None
28            }
29            None => None,
30        }
31        .map(AttributeKind::MacroTransparency)
32    }
33}