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