rustc_attr_parsing/attributes/
rustc_internal.rs

1use super::prelude::*;
2use super::util::parse_single_integer;
3
4pub(crate) struct RustcLayoutScalarValidRangeStart;
5
6impl<S: Stage> SingleAttributeParser<S> for RustcLayoutScalarValidRangeStart {
7    const PATH: &'static [Symbol] = &[sym::rustc_layout_scalar_valid_range_start];
8    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
9    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
10    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Struct)]);
11    const TEMPLATE: AttributeTemplate = template!(List: &["start"]);
12
13    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
14        parse_single_integer(cx, args)
15            .map(|n| AttributeKind::RustcLayoutScalarValidRangeStart(Box::new(n), cx.attr_span))
16    }
17}
18
19pub(crate) struct RustcLayoutScalarValidRangeEnd;
20
21impl<S: Stage> SingleAttributeParser<S> for RustcLayoutScalarValidRangeEnd {
22    const PATH: &'static [Symbol] = &[sym::rustc_layout_scalar_valid_range_end];
23    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
24    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
25    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Struct)]);
26    const TEMPLATE: AttributeTemplate = template!(List: &["end"]);
27
28    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
29        parse_single_integer(cx, args)
30            .map(|n| AttributeKind::RustcLayoutScalarValidRangeEnd(Box::new(n), cx.attr_span))
31    }
32}
33
34pub(crate) struct RustcObjectLifetimeDefaultParser;
35
36impl<S: Stage> SingleAttributeParser<S> for RustcObjectLifetimeDefaultParser {
37    const PATH: &[rustc_span::Symbol] = &[sym::rustc_object_lifetime_default];
38    const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
39    const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
40    const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Struct)]);
41    const TEMPLATE: AttributeTemplate = template!(Word);
42
43    fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
44        if let Err(span) = args.no_args() {
45            cx.expected_no_args(span);
46            return None;
47        }
48
49        Some(AttributeKind::RustcObjectLifetimeDefault)
50    }
51}