rustc_attr_parsing/attributes/
rustc_dump.rs1use rustc_attr_ir::target::{AssocCtxt, MethodKind, Target};
2use rustc_attr_ir::{AttributeKind, RustcDumpLayoutKind};
3use rustc_feature::AttributeStability;
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 = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::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 = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::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 = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::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(AssocCtxt::Impl { of_trait: false })),
63 Allow(Target::AssocConst(AssocCtxt::Trait)),
64 Allow(Target::AssocConst(AssocCtxt::Impl { of_trait: true })),
65 Allow(Target::AssocTy(AssocCtxt::Impl { of_trait: false })),
66 Allow(Target::AssocTy(AssocCtxt::Trait)),
67 Allow(Target::AssocTy(AssocCtxt::Impl { of_trait: true })),
68 Allow(Target::Impl { of_trait: false }),
69 Allow(Target::Impl { of_trait: true }),
70 Allow(Target::Method(MethodKind::Inherent)),
71 Allow(Target::Method(MethodKind::Trait { body: false })),
72 Allow(Target::Method(MethodKind::Trait { body: true })),
73 Allow(Target::Method(MethodKind::TraitImpl)),
74 Allow(Target::Delegation { mac: false }),
75 Allow(Target::Delegation { mac: true }),
76 ]);
77 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
78 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpGenerics;
79}
80
81pub(crate) struct RustcDumpHiddenTypeOfOpaquesParser;
82
83impl NoArgsAttributeParser for RustcDumpHiddenTypeOfOpaquesParser {
84 const PATH: &[Symbol] = &[sym::rustc_dump_hidden_type_of_opaques];
85 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
86 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
87 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpHiddenTypeOfOpaques;
88}
89
90pub(crate) struct RustcDumpInferredOutlivesParser;
91
92impl NoArgsAttributeParser for RustcDumpInferredOutlivesParser {
93 const PATH: &[Symbol] = &[sym::rustc_dump_inferred_outlives];
94 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
95 Allow(Target::Struct),
96 Allow(Target::Enum),
97 Allow(Target::Union),
98 Allow(Target::TyAlias),
99 ]);
100 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
101 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpInferredOutlives;
102}
103
104pub(crate) struct RustcDumpItemBoundsParser;
105
106impl NoArgsAttributeParser for RustcDumpItemBoundsParser {
107 const PATH: &[Symbol] = &[sym::rustc_dump_item_bounds];
108 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
109 Allow(Target::AssocTy(AssocCtxt::Impl { of_trait: false })),
110 Allow(Target::AssocTy(AssocCtxt::Trait)),
111 Allow(Target::AssocTy(AssocCtxt::Impl { of_trait: true })),
112 ]);
113 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
114 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpItemBounds;
115}
116
117pub(crate) struct RustcDumpLayoutParser;
118
119impl CombineAttributeParser for RustcDumpLayoutParser {
120 const PATH: &[Symbol] = &[sym::rustc_dump_layout];
121
122 type Item = RustcDumpLayoutKind;
123
124 const CONVERT: ConvertFn<Self::Item> = |items, _| AttributeKind::RustcDumpLayout(items);
125
126 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
127 Allow(Target::Struct),
128 Allow(Target::Enum),
129 Allow(Target::Union),
130 Allow(Target::TyAlias),
131 ]);
132
133 const TEMPLATE: AttributeTemplate = crate::AttributeTemplate {
word: false,
list: Some(&["abi", "align", "size", "homogenous_aggregate",
"largest_niche", "debug"]),
one_of: &[],
name_value_str: None,
docs: None,
}template!(List: &["abi", "align", "size", "homogenous_aggregate", "largest_niche", "debug"]);
134 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
135
136 fn extend(
137 cx: &mut AcceptContext<'_, '_>,
138 args: &ArgParser,
139 ) -> impl IntoIterator<Item = Self::Item> {
140 let Some(items) = cx.expect_list(args, cx.attr_span) else {
141 return ::alloc::vec::Vec::new()vec![];
142 };
143
144 let mut result = Vec::new();
145 for item in items.mixed() {
146 let Some(arg) = item.meta_item_no_args() else {
147 cx.adcx().expected_not_literal(item.span());
148 continue;
149 };
150 let Some(ident) = arg.ident() else {
151 cx.adcx().expected_identifier(arg.span());
152 return ::alloc::vec::Vec::new()vec![];
153 };
154 let kind = match ident.name {
155 sym::align => RustcDumpLayoutKind::Align,
156 sym::backend_repr => RustcDumpLayoutKind::BackendRepr,
157 sym::debug => RustcDumpLayoutKind::Debug,
158 sym::homogeneous_aggregate => RustcDumpLayoutKind::HomogenousAggregate,
159 sym::largest_niche => RustcDumpLayoutKind::LargestNiche,
160 sym::size => RustcDumpLayoutKind::Size,
161 _ => {
162 cx.adcx().expected_specific_argument(
163 ident.span,
164 &[
165 sym::align,
166 sym::backend_repr,
167 sym::debug,
168 sym::homogeneous_aggregate,
169 sym::size,
170 ],
171 );
172 continue;
173 }
174 };
175 result.push(kind);
176 }
177 result
178 }
179}
180
181pub(crate) struct RustcDumpObjectLifetimeDefaultsParser;
182
183impl NoArgsAttributeParser for RustcDumpObjectLifetimeDefaultsParser {
184 const PATH: &[Symbol] = &[sym::rustc_dump_object_lifetime_defaults];
185 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
186 Allow(Target::AssocConst(AssocCtxt::Impl { of_trait: false })),
187 Allow(Target::AssocConst(AssocCtxt::Trait)),
188 Allow(Target::AssocConst(AssocCtxt::Impl { of_trait: true })),
189 Allow(Target::AssocTy(AssocCtxt::Impl { of_trait: false })),
190 Allow(Target::AssocTy(AssocCtxt::Trait)),
191 Allow(Target::AssocTy(AssocCtxt::Impl { of_trait: true })),
192 Allow(Target::Const),
193 Allow(Target::Enum),
194 Allow(Target::Fn),
195 Allow(Target::ForeignFn),
196 Allow(Target::Impl { of_trait: false }),
197 Allow(Target::Impl { of_trait: true }),
198 Allow(Target::Method(MethodKind::Inherent)),
199 Allow(Target::Method(MethodKind::Trait { body: false })),
200 Allow(Target::Method(MethodKind::Trait { body: true })),
201 Allow(Target::Method(MethodKind::TraitImpl)),
202 Allow(Target::Struct),
203 Allow(Target::Trait),
204 Allow(Target::TraitAlias),
205 Allow(Target::TyAlias),
206 Allow(Target::Union),
207 ]);
208 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
209 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpObjectLifetimeDefaults;
210}
211
212pub(crate) struct RustcDumpClausesParser;
213
214impl NoArgsAttributeParser for RustcDumpClausesParser {
215 const PATH: &[Symbol] = &[sym::rustc_dump_clauses];
216 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
217 Allow(Target::AssocConst(AssocCtxt::Impl { of_trait: false })),
218 Allow(Target::AssocConst(AssocCtxt::Trait)),
219 Allow(Target::AssocConst(AssocCtxt::Impl { of_trait: true })),
220 Allow(Target::AssocTy(AssocCtxt::Impl { of_trait: false })),
221 Allow(Target::AssocTy(AssocCtxt::Trait)),
222 Allow(Target::AssocTy(AssocCtxt::Impl { of_trait: true })),
223 Allow(Target::Const),
224 Allow(Target::Delegation { mac: false }),
225 Allow(Target::Delegation { mac: true }),
226 Allow(Target::Enum),
227 Allow(Target::Fn),
228 Allow(Target::Impl { of_trait: false }),
229 Allow(Target::Impl { of_trait: true }),
230 Allow(Target::Method(MethodKind::Inherent)),
231 Allow(Target::Method(MethodKind::Trait { body: false })),
232 Allow(Target::Method(MethodKind::Trait { body: true })),
233 Allow(Target::Method(MethodKind::TraitImpl)),
234 Allow(Target::Struct),
235 Allow(Target::Trait),
236 Allow(Target::TraitAlias),
237 Allow(Target::TyAlias),
238 Allow(Target::Union),
239 ]);
240 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
241 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpClauses;
242}
243
244pub(crate) struct RustcDumpSymbolNameParser;
245
246impl SingleAttributeParser for RustcDumpSymbolNameParser {
247 const PATH: &[Symbol] = &[sym::rustc_dump_symbol_name];
248 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
249 Allow(Target::Fn),
250 Allow(Target::Method(MethodKind::TraitImpl)),
251 Allow(Target::Method(MethodKind::Inherent)),
252 Allow(Target::Method(MethodKind::Trait { body: true })),
253 Allow(Target::ForeignFn),
254 Allow(Target::ForeignStatic),
255 Allow(Target::Impl { of_trait: false }),
256 ]);
257 const TEMPLATE: AttributeTemplate = crate::AttributeTemplate {
word: true,
list: None,
one_of: &[],
name_value_str: None,
docs: None,
}template!(Word);
258 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
259 fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
260 cx.expect_no_args(args)?;
261 Some(AttributeKind::RustcDumpSymbolName(cx.attr_span))
262 }
263}
264
265pub(crate) struct RustcDumpVariancesParser;
266
267impl NoArgsAttributeParser for RustcDumpVariancesParser {
268 const PATH: &[Symbol] = &[sym::rustc_dump_variances];
269 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
270 Allow(Target::Enum),
271 Allow(Target::Fn),
272 Allow(Target::Method(MethodKind::Inherent)),
273 Allow(Target::Method(MethodKind::Trait { body: false })),
274 Allow(Target::Method(MethodKind::Trait { body: true })),
275 Allow(Target::Method(MethodKind::TraitImpl)),
276 Allow(Target::Struct),
277 Allow(Target::Union),
278 ]);
279 const STABILITY: AttributeStability =
280 {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &["the `rustc_dump_variances` attribute is used for rustc unit tests"],
}
}unstable!(rustc_attrs, "the `rustc_dump_variances` attribute is used for rustc unit tests");
281 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpVariances;
282}
283
284pub(crate) struct RustcDumpVariancesOfOpaquesParser;
285
286impl NoArgsAttributeParser for RustcDumpVariancesOfOpaquesParser {
287 const PATH: &[Symbol] = &[sym::rustc_dump_variances_of_opaques];
288 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
289 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
290 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcDumpVariancesOfOpaques;
291}
292
293pub(crate) struct RustcDumpVtableParser;
294
295impl NoArgsAttributeParser for RustcDumpVtableParser {
296 const PATH: &[Symbol] = &[sym::rustc_dump_vtable];
297 const ALLOWED_TARGETS: AllowedTargets<'_> = AllowedTargets::AllowList(&[
298 Allow(Target::Impl { of_trait: true }),
299 Allow(Target::TyAlias),
300 ]);
301 const STABILITY: AttributeStability = {
_ = rustc_feature::Features::rustc_attrs;
AttributeStability::Unstable {
gate_name: rustc_span::sym::rustc_attrs,
notes: &[],
}
}unstable!(rustc_attrs);
302 const CREATE: fn(Span) -> AttributeKind = AttributeKind::RustcDumpVtable;
303}