Skip to main content

rustc_attr_parsing/
generated.rs

1use std::num::NonZero;
2
3use rustc_ast::GeneratedAttr;
4use rustc_attr_ir::{
5    Attribute, AttributeKind, CoverageAttrKind, DocAttribute, InlineAttr, PartialConstStability,
6    StabilityLevel, UnstableReason,
7};
8use rustc_span::{Span, sym};
9use thin_vec::ThinVec;
10
11/// Contains the state necessary to convert generated attributes to parsed attributes.
12
13#[derive(#[automatically_derived]impl ::core::default::Default for GeneratedAttrState {
    #[inline]
    fn default() -> Self {
        GeneratedAttrState { state: ::core::default::Default::default() }
    }
}Default)]
14pub(crate) struct GeneratedAttrState {
15    state: ThinVec<AttributeKind>,
16}
17
18impl GeneratedAttrState {
19    pub(crate) fn accept_generated_attr(&mut self, span: Span, generated: &GeneratedAttr) {
20        let attr = match *generated {
21            GeneratedAttr::AutomaticallyDerived => AttributeKind::AutomaticallyDerived,
22            GeneratedAttr::RustcConstUnstableDerived => AttributeKind::RustcConstStability {
23                stability: PartialConstStability {
24                    feature: sym::derive_const,
25                    promotable: false,
26                    level: StabilityLevel::Unstable {
27                        reason: UnstableReason::None,
28                        implied_by: None,
29                        issue: NonZero::new(143874),
30                        old_name: None,
31                    },
32                },
33                span,
34            },
35            GeneratedAttr::Inline => AttributeKind::Inline(InlineAttr::Hint, span),
36            GeneratedAttr::DocHidden => AttributeKind::Doc(Box::new({
37                let mut d = DocAttribute::default();
38                d.hidden = Some(span);
39                d
40            })),
41            GeneratedAttr::CoverageOff => AttributeKind::Coverage(CoverageAttrKind::Off),
42            GeneratedAttr::RustcTestMarker(test_marker) => {
43                AttributeKind::RustcTestMarker(test_marker)
44            }
45        };
46        self.state.push(attr);
47    }
48
49    pub(crate) fn finalize_generated_attrs(self, attributes: &mut Vec<Attribute>) {
50        for attr in self.state {
51            attributes.push(Attribute::Parsed(attr))
52        }
53    }
54}