Skip to main content

rustc_attr_parsing/attributes/
rustc_dump.rs

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