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}