Skip to main content

rustc_attr_parsing/attributes/
rustc_dump.rs

1use 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}