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