rustc_attr_parsing/attributes/
link_attrs.rs

1use rustc_attr_data_structures::AttributeKind;
2use rustc_attr_data_structures::AttributeKind::LinkName;
3use rustc_feature::{AttributeTemplate, template};
4use rustc_span::{Symbol, sym};
5
6use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
7use crate::context::{AcceptContext, Stage};
8use crate::parser::ArgParser;
9
10pub(crate) struct LinkNameParser;
11
12impl<S: Stage> SingleAttributeParser<S> for LinkNameParser {
13    const PATH: &[Symbol] = &[sym::link_name];
14    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
15    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
16    const TEMPLATE: AttributeTemplate = template!(NameValueStr: "name");
17
18    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
19        let Some(nv) = args.name_value() else {
20            cx.expected_name_value(cx.attr_span, None);
21            return None;
22        };
23        let Some(name) = nv.value_as_str() else {
24            cx.expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
25            return None;
26        };
27
28        Some(LinkName { name, span: cx.attr_span })
29    }
30}