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