rustc_attr_parsing/
generated.rs1use 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#[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}