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}