rustc_attr_parsing/attributes/
crate_level.rs

1use super::prelude::*;
2
3pub(crate) struct CrateNameParser;
4
5impl<S: Stage> SingleAttributeParser<S> for CrateNameParser {
6    const PATH: &[Symbol] = &[sym::crate_name];
7    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
8    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
9    const TEMPLATE: AttributeTemplate = template!(NameValueStr: "name");
10    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::CrateLevel;
11
12    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
13        let ArgParser::NameValue(n) = args else {
14            cx.expected_name_value(cx.attr_span, None);
15            return None;
16        };
17
18        let Some(name) = n.value_as_str() else {
19            cx.expected_string_literal(n.value_span, Some(n.value_as_lit()));
20            return None;
21        };
22
23        Some(AttributeKind::CrateName {
24            name,
25            name_span: n.value_span,
26            attr_span: cx.attr_span,
27            style: cx.attr_style,
28        })
29    }
30}
31
32pub(crate) struct RecursionLimitParser;
33
34impl<S: Stage> SingleAttributeParser<S> for RecursionLimitParser {
35    const PATH: &[Symbol] = &[sym::recursion_limit];
36    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
37    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
38    const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N", "https://doc.rust-lang.org/reference/attributes/limits.html#the-recursion_limit-attribute");
39    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::CrateLevel;
40
41    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
42        let ArgParser::NameValue(nv) = args else {
43            cx.expected_name_value(cx.attr_span, None);
44            return None;
45        };
46
47        Some(AttributeKind::RecursionLimit {
48            limit: cx.parse_limit_int(nv)?,
49            attr_span: cx.attr_span,
50            limit_span: nv.value_span,
51        })
52    }
53}
54
55pub(crate) struct MoveSizeLimitParser;
56
57impl<S: Stage> SingleAttributeParser<S> for MoveSizeLimitParser {
58    const PATH: &[Symbol] = &[sym::move_size_limit];
59    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
60    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
61    const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N");
62    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::CrateLevel;
63
64    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
65        let ArgParser::NameValue(nv) = args else {
66            cx.expected_name_value(cx.attr_span, None);
67            return None;
68        };
69
70        Some(AttributeKind::MoveSizeLimit {
71            limit: cx.parse_limit_int(nv)?,
72            attr_span: cx.attr_span,
73            limit_span: nv.value_span,
74        })
75    }
76}
77
78pub(crate) struct TypeLengthLimitParser;
79
80impl<S: Stage> SingleAttributeParser<S> for TypeLengthLimitParser {
81    const PATH: &[Symbol] = &[sym::type_length_limit];
82    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
83    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
84    const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N");
85    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::CrateLevel;
86
87    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
88        let ArgParser::NameValue(nv) = args else {
89            cx.expected_name_value(cx.attr_span, None);
90            return None;
91        };
92
93        Some(AttributeKind::TypeLengthLimit {
94            limit: cx.parse_limit_int(nv)?,
95            attr_span: cx.attr_span,
96            limit_span: nv.value_span,
97        })
98    }
99}
100
101pub(crate) struct PatternComplexityLimitParser;
102
103impl<S: Stage> SingleAttributeParser<S> for PatternComplexityLimitParser {
104    const PATH: &[Symbol] = &[sym::pattern_complexity_limit];
105    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
106    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
107    const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N");
108    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::CrateLevel;
109
110    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
111        let ArgParser::NameValue(nv) = args else {
112            cx.expected_name_value(cx.attr_span, None);
113            return None;
114        };
115
116        Some(AttributeKind::PatternComplexityLimit {
117            limit: cx.parse_limit_int(nv)?,
118            attr_span: cx.attr_span,
119            limit_span: nv.value_span,
120        })
121    }
122}
123
124pub(crate) struct NoCoreParser;
125
126impl<S: Stage> NoArgsAttributeParser<S> for NoCoreParser {
127    const PATH: &[Symbol] = &[sym::no_core];
128    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
129    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::CrateLevel;
130    const CREATE: fn(Span) -> AttributeKind = AttributeKind::NoCore;
131}
132
133pub(crate) struct NoStdParser;
134
135impl<S: Stage> NoArgsAttributeParser<S> for NoStdParser {
136    const PATH: &[Symbol] = &[sym::no_std];
137    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
138    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::CrateLevel;
139    const CREATE: fn(Span) -> AttributeKind = AttributeKind::NoStd;
140}
141
142pub(crate) struct RustcCoherenceIsCoreParser;
143
144impl<S: Stage> NoArgsAttributeParser<S> for RustcCoherenceIsCoreParser {
145    const PATH: &[Symbol] = &[sym::rustc_coherence_is_core];
146    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
147    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::CrateLevel;
148    const CREATE: fn(Span) -> AttributeKind = AttributeKind::RustcCoherenceIsCore;
149}