rustc_attr_parsing/attributes/
crate_level.rs

1use rustc_feature::AttributeType;
2
3use super::prelude::*;
4
5pub(crate) struct CrateNameParser;
6
7impl<S: Stage> SingleAttributeParser<S> for CrateNameParser {
8    const PATH: &[Symbol] = &[sym::crate_name];
9    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
10    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
11    const TEMPLATE: AttributeTemplate = template!(NameValueStr: "name");
12    const TYPE: AttributeType = AttributeType::CrateLevel;
13
14    // FIXME: crate name is allowed on all targets and ignored,
15    //        even though it should only be valid on crates of course
16    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(ALL_TARGETS);
17
18    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
19        let ArgParser::NameValue(n) = args else {
20            cx.expected_name_value(cx.attr_span, None);
21            return None;
22        };
23
24        let Some(name) = n.value_as_str() else {
25            cx.expected_string_literal(n.value_span, Some(n.value_as_lit()));
26            return None;
27        };
28
29        Some(AttributeKind::CrateName {
30            name,
31            name_span: n.value_span,
32            attr_span: cx.attr_span,
33            style: cx.attr_style,
34        })
35    }
36}