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