rustc_attr_parsing/attributes/
rustc_internal.rs

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