rustc_attr_parsing/attributes/
crate_level.rs1use 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}