133d722a9Sopenharmony_ciuse proc_macro2::TokenStream; 233d722a9Sopenharmony_ciuse quote::{quote, ToTokens}; 333d722a9Sopenharmony_ciuse syn::LitStr; 433d722a9Sopenharmony_ci 533d722a9Sopenharmony_cipub struct Doc { 633d722a9Sopenharmony_ci pub(crate) hidden: bool, 733d722a9Sopenharmony_ci fragments: Vec<LitStr>, 833d722a9Sopenharmony_ci} 933d722a9Sopenharmony_ci 1033d722a9Sopenharmony_ciimpl Doc { 1133d722a9Sopenharmony_ci pub fn new() -> Self { 1233d722a9Sopenharmony_ci Doc { 1333d722a9Sopenharmony_ci hidden: false, 1433d722a9Sopenharmony_ci fragments: Vec::new(), 1533d722a9Sopenharmony_ci } 1633d722a9Sopenharmony_ci } 1733d722a9Sopenharmony_ci 1833d722a9Sopenharmony_ci pub fn push(&mut self, lit: LitStr) { 1933d722a9Sopenharmony_ci self.fragments.push(lit); 2033d722a9Sopenharmony_ci } 2133d722a9Sopenharmony_ci 2233d722a9Sopenharmony_ci #[allow(dead_code)] // only used by cxx-build, not cxxbridge-macro 2333d722a9Sopenharmony_ci pub fn is_empty(&self) -> bool { 2433d722a9Sopenharmony_ci self.fragments.is_empty() 2533d722a9Sopenharmony_ci } 2633d722a9Sopenharmony_ci 2733d722a9Sopenharmony_ci #[allow(dead_code)] // only used by cxx-build, not cxxbridge-macro 2833d722a9Sopenharmony_ci pub fn to_string(&self) -> String { 2933d722a9Sopenharmony_ci let mut doc = String::new(); 3033d722a9Sopenharmony_ci for lit in &self.fragments { 3133d722a9Sopenharmony_ci doc += &lit.value(); 3233d722a9Sopenharmony_ci doc.push('\n'); 3333d722a9Sopenharmony_ci } 3433d722a9Sopenharmony_ci doc 3533d722a9Sopenharmony_ci } 3633d722a9Sopenharmony_ci} 3733d722a9Sopenharmony_ci 3833d722a9Sopenharmony_ciimpl ToTokens for Doc { 3933d722a9Sopenharmony_ci fn to_tokens(&self, tokens: &mut TokenStream) { 4033d722a9Sopenharmony_ci let fragments = &self.fragments; 4133d722a9Sopenharmony_ci tokens.extend(quote! { #(#[doc = #fragments])* }); 4233d722a9Sopenharmony_ci if self.hidden { 4333d722a9Sopenharmony_ci tokens.extend(quote! { #[doc(hidden)] }); 4433d722a9Sopenharmony_ci } 4533d722a9Sopenharmony_ci } 4633d722a9Sopenharmony_ci} 47