Skip to main content

rustc_attr_parsing/attributes/
rustc_dump.rs

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