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