cxx_gen/syntax/
doc.rs

1use proc_macro2::TokenStream;
2use quote::{quote, ToTokens};
3use syn::LitStr;
4
5pub(crate) struct Doc {
6    pub hidden: bool,
7    fragments: Vec<LitStr>,
8}
9
10impl Doc {
11    pub(crate) fn new() -> Self {
12        Doc {
13            hidden: false,
14            fragments: Vec::new(),
15        }
16    }
17
18    pub(crate) fn push(&mut self, lit: LitStr) {
19        self.fragments.push(lit);
20    }
21
22    #[cfg_attr(proc_macro, expect(dead_code))]
23    pub(crate) fn is_empty(&self) -> bool {
24        self.fragments.is_empty()
25    }
26
27    #[cfg_attr(proc_macro, expect(dead_code))]
28    pub(crate) fn to_string(&self) -> String {
29        let mut doc = String::new();
30        for lit in &self.fragments {
31            doc += &lit.value();
32            doc.push('\n');
33        }
34        doc
35    }
36}
37
38impl ToTokens for Doc {
39    fn to_tokens(&self, tokens: &mut TokenStream) {
40        let fragments = &self.fragments;
41        tokens.extend({
    let mut _s = ::quote::__private::TokenStream::new();
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::ThereIsNoIteratorInRepetition;
        #[allow(unused_mut)]
        let (mut fragments, i) = fragments.quote_into_iter();
        let has_iter = has_iter | i;
        let _: ::quote::__private::HasIterator = has_iter;
        while true {
            let fragments =
                match fragments.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "doc");
                    ::quote::__private::push_eq(&mut _s);
                    ::quote::ToTokens::to_tokens(&fragments, &mut _s);
                    _s
                });
        }
    }
    _s
}quote! { #(#[doc = #fragments])* });
42        if self.hidden {
43            tokens.extend({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "doc");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "hidden");
                    _s
                });
            _s
        });
    _s
}quote! { #[doc(hidden)] });
44        }
45    }
46}