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}