rustc_attr_parsing/attributes/
rustc_dump.rs1use rustc_feature::AttributeStability;
2use rustc_hir::attrs::{AttributeKind, RustcDumpLayoutKind};
3use rustc_hir::{MethodKind, Target};
4use rustc_span::{Span, Symbol, sym};
5
6use super::prelude::*;
7use crate::target_checking::AllowedTargets;
8
9pub(crate) struct RustcDumpUserArgsParser;
10
11impl NoArgsAttributeParser for RustcDumpUserArgsParser {
12 const PATH: &[Symbol] = &[sym::rustc_dump_user_args];
13 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[Allow(Target::Fn)]);
14 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
15 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpUserArgs;
16}
17
18pub(crate) struct RustcDumpDefParentsParser;
19
20impl NoArgsAttributeParser for RustcDumpDefParentsParser {
21 const PATH: &[Symbol] = &[sym::rustc_dump_def_parents];
22 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[Allow(Target::Fn)]);
23 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
24 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpDefParents;
25}
26
27pub(crate) struct RustcDumpDefPathParser;
28
29impl SingleAttributeParser for RustcDumpDefPathParser {
30 const PATH: &[Symbol] = &[sym::rustc_dump_def_path];
31 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
32 Allow(Target::Fn),
33 Allow(Target::Method(MethodKind::TraitImpl)),
34 Allow(Target::Method(MethodKind::Inherent)),
35 Allow(Target::Method(MethodKind::Trait { body: true })),
36 Allow(Target::ForeignFn),
37 Allow(Target::ForeignStatic),
38 Allow(Target::Impl { of_trait: false }),
39 ]);
40 const TEMPLATE: AttributeTemplate = crate::AttributeTemplate {
word: true,
list: None,
one_of: &[],
name_value_str: None,
docs: None,
}template!(Word);
41 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
42 fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
43 cx.expect_no_args(args)?;
44 Some(AttributeKind::RustcDumpDefPath(cx.attr_span))
45 }
46}
47
48pub(crate) struct RustcDumpGenericsParser;
49
50impl NoArgsAttributeParser for RustcDumpGenericsParser {
51 const PATH: &[Symbol] = &[sym::rustc_dump_generics];
52 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
53 Allow(Target::Struct),
54 Allow(Target::Enum),
55 Allow(Target::Union),
56 Allow(Target::Trait),
57 Allow(Target::TraitAlias),
58 Allow(Target::Fn),
59 Allow(Target::Closure),
60 Allow(Target::TyAlias),
61 Allow(Target::Const),
62 Allow(Target::AssocConst),
63 Allow(Target::AssocTy),
64 Allow(Target::Impl { of_trait: false }),
65 Allow(Target::Impl { of_trait: true }),
66 Allow(Target::Method(MethodKind::Inherent)),
67 Allow(Target::Method(MethodKind::Trait { body: false })),
68 Allow(Target::Method(MethodKind::Trait { body: true })),
69 Allow(Target::Method(MethodKind::TraitImpl)),
70 Allow(Target::Delegation { mac: false }),
71 Allow(Target::Delegation { mac: true }),
72 ]);
73 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
74 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpGenerics;
75}
76
77pub(crate) struct RustcDumpHiddenTypeOfOpaquesParser;
78
79impl NoArgsAttributeParser for RustcDumpHiddenTypeOfOpaquesParser {
80 const PATH: &[Symbol] = &[sym::rustc_dump_hidden_type_of_opaques];
81 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
82 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
83 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpHiddenTypeOfOpaques;
84}
85
86pub(crate) struct RustcDumpInferredOutlivesParser;
87
88impl NoArgsAttributeParser for RustcDumpInferredOutlivesParser {
89 const PATH: &[Symbol] = &[sym::rustc_dump_inferred_outlives];
90 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
91 Allow(Target::Struct),
92 Allow(Target::Enum),
93 Allow(Target::Union),
94 Allow(Target::TyAlias),
95 ]);
96 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
97 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpInferredOutlives;
98}
99
100pub(crate) struct RustcDumpItemBoundsParser;
101
102impl NoArgsAttributeParser for RustcDumpItemBoundsParser {
103 const PATH: &[Symbol] = &[sym::rustc_dump_item_bounds];
104 const ALLOWED_TARGETS: AllowedTargets<'_> =
105 AllowedTargets::AllowList(&[Allow(Target::AssocTy)]);
106 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
107 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpItemBounds;
108}
109
110pub(crate) struct RustcDumpLayoutParser;
111
112impl CombineAttributeParser for RustcDumpLayoutParser {
113 const PATH: &[Symbol] = &[sym::rustc_dump_layout];
114
115 type Item = RustcDumpLayoutKind;
116
117 const CONVERT: ConvertFn<Self::Item> = |items, _| AttributeKind::RustcDumpLayout(items);
118
119 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
120 Allow(Target::Struct),
121 Allow(Target::Enum),
122 Allow(Target::Union),
123 Allow(Target::TyAlias),
124 ]);
125
126 const TEMPLATE: AttributeTemplate =
127 crate::AttributeTemplate {
word: false,
list: Some(&["abi", "align", "size", "homogenous_aggregate", "debug"]),
one_of: &[],
name_value_str: None,
docs: None,
}template!(List: &["abi", "align", "size", "homogenous_aggregate", "debug"]);
128 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
129
130 fn extend(
131 cx: &mut AcceptContext<'_, '_>,
132 args: &ArgParser,
133 ) -> impl IntoIterator<Item = Self::Item> {
134 let Some(items) = cx.expect_list(args, cx.attr_span) else {
135 return ::alloc::vec::Vec::new()vec![];
136 };
137
138 let mut result = Vec::new();
139 for item in items.mixed() {
140 let Some(arg) = item.meta_item_no_args() else {
141 cx.adcx().expected_not_literal(item.span());
142 continue;
143 };
144 let Some(ident) = arg.ident() else {
145 cx.adcx().expected_identifier(arg.span());
146 return ::alloc::vec::Vec::new()vec![];
147 };
148 let kind = match ident.name {
149 sym::align => RustcDumpLayoutKind::Align,
150 sym::backend_repr => RustcDumpLayoutKind::BackendRepr,
151 sym::debug => RustcDumpLayoutKind::Debug,
152 sym::homogeneous_aggregate => RustcDumpLayoutKind::HomogenousAggregate,
153 sym::size => RustcDumpLayoutKind::Size,
154 _ => {
155 cx.adcx().expected_specific_argument(
156 ident.span,
157 &[
158 sym::align,
159 sym::backend_repr,
160 sym::debug,
161 sym::homogeneous_aggregate,
162 sym::size,
163 ],
164 );
165 continue;
166 }
167 };
168 result.push(kind);
169 }
170 result
171 }
172}
173
174pub(crate) struct RustcDumpObjectLifetimeDefaultsParser;
175
176impl NoArgsAttributeParser for RustcDumpObjectLifetimeDefaultsParser {
177 const PATH: &[Symbol] = &[sym::rustc_dump_object_lifetime_defaults];
178 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
179 Allow(Target::AssocConst),
180 Allow(Target::AssocTy),
181 Allow(Target::Const),
182 Allow(Target::Enum),
183 Allow(Target::Fn),
184 Allow(Target::ForeignFn),
185 Allow(Target::Impl { of_trait: false }),
186 Allow(Target::Impl { of_trait: true }),
187 Allow(Target::Method(MethodKind::Inherent)),
188 Allow(Target::Method(MethodKind::Trait { body: false })),
189 Allow(Target::Method(MethodKind::Trait { body: true })),
190 Allow(Target::Method(MethodKind::TraitImpl)),
191 Allow(Target::Struct),
192 Allow(Target::Trait),
193 Allow(Target::TraitAlias),
194 Allow(Target::TyAlias),
195 Allow(Target::Union),
196 ]);
197 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
198 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpObjectLifetimeDefaults;
199}
200
201pub(crate) struct RustcDumpPredicatesParser;
202
203impl NoArgsAttributeParser for RustcDumpPredicatesParser {
204 const PATH: &[Symbol] = &[sym::rustc_dump_predicates];
205 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
206 Allow(Target::AssocConst),
207 Allow(Target::AssocTy),
208 Allow(Target::Const),
209 Allow(Target::Delegation { mac: false }),
210 Allow(Target::Delegation { mac: true }),
211 Allow(Target::Enum),
212 Allow(Target::Fn),
213 Allow(Target::Impl { of_trait: false }),
214 Allow(Target::Impl { of_trait: true }),
215 Allow(Target::Method(MethodKind::Inherent)),
216 Allow(Target::Method(MethodKind::Trait { body: false })),
217 Allow(Target::Method(MethodKind::Trait { body: true })),
218 Allow(Target::Method(MethodKind::TraitImpl)),
219 Allow(Target::Struct),
220 Allow(Target::Trait),
221 Allow(Target::TraitAlias),
222 Allow(Target::TyAlias),
223 Allow(Target::Union),
224 ]);
225 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
226 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpPredicates;
227}
228
229pub(crate) struct RustcDumpSymbolNameParser;
230
231impl SingleAttributeParser for RustcDumpSymbolNameParser {
232 const PATH: &[Symbol] = &[sym::rustc_dump_symbol_name];
233 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
234 Allow(Target::Fn),
235 Allow(Target::Method(MethodKind::TraitImpl)),
236 Allow(Target::Method(MethodKind::Inherent)),
237 Allow(Target::Method(MethodKind::Trait { body: true })),
238 Allow(Target::ForeignFn),
239 Allow(Target::ForeignStatic),
240 Allow(Target::Impl { of_trait: false }),
241 ]);
242 const TEMPLATE: AttributeTemplate = crate::AttributeTemplate {
word: true,
list: None,
one_of: &[],
name_value_str: None,
docs: None,
}template!(Word);
243 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
244 fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
245 cx.expect_no_args(args)?;
246 Some(AttributeKind::RustcDumpSymbolName(cx.attr_span))
247 }
248}
249
250pub(crate) struct RustcDumpVariancesParser;
251
252impl NoArgsAttributeParser for RustcDumpVariancesParser {
253 const PATH: &[Symbol] = &[sym::rustc_dump_variances];
254 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
255 Allow(Target::Enum),
256 Allow(Target::Fn),
257 Allow(Target::Method(MethodKind::Inherent)),
258 Allow(Target::Method(MethodKind::Trait { body: false })),
259 Allow(Target::Method(MethodKind::Trait { body: true })),
260 Allow(Target::Method(MethodKind::TraitImpl)),
261 Allow(Target::Struct),
262 Allow(Target::Union),
263 ]);
264 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &["the `#[rustc_dump_variances]` attribute is used for rustc unit tests"],
}unstable!(
265 rustc_attrs,
266 "the `#[rustc_dump_variances]` attribute is used for rustc unit tests"
267 );
268 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpVariances;
269}
270
271pub(crate) struct RustcDumpVariancesOfOpaquesParser;
272
273impl NoArgsAttributeParser for RustcDumpVariancesOfOpaquesParser {
274 const PATH: &[Symbol] = &[sym::rustc_dump_variances_of_opaques];
275 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
276 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
277 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpVariancesOfOpaques;
278}
279
280pub(crate) struct RustcDumpVtableParser;
281
282impl NoArgsAttributeParser for RustcDumpVtableParser {
283 const PATH: &[Symbol] = &[sym::rustc_dump_vtable];
284 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
285 Allow(Target::Impl { of_trait: true }),
286 Allow(Target::TyAlias),
287 ]);
288 const STABILITY: AttributeStability = AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
gate_check: rustc_feature::Features::rustc_attrs,
notes: &[],
}unstable!(rustc_attrs);
289 const CREATE: fn(Span) -> AttributeKind = AttributeKind::RustcDumpVtable;
290}