aboutsummaryrefslogtreecommitdiff
path: root/syntax/doc.rs
blob: bd8111eaf6884ed198b7c0794f5289c0adef19af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use proc_macro2::TokenStream;
use quote::{quote, ToTokens};
use syn::LitStr;

pub(crate) struct Doc {
    pub hidden: bool,
    fragments: Vec<LitStr>,
}

impl Doc {
    pub(crate) fn new() -> Self {
        Doc {
            hidden: false,
            fragments: Vec::new(),
        }
    }

    pub(crate) fn push(&mut self, lit: LitStr) {
        self.fragments.push(lit);
    }

    #[allow(dead_code)] // only used by cxx-build, not cxxbridge-macro
    pub(crate) fn is_empty(&self) -> bool {
        self.fragments.is_empty()
    }

    #[allow(dead_code)] // only used by cxx-build, not cxxbridge-macro
    pub(crate) fn to_string(&self) -> String {
        let mut doc = String::new();
        for lit in &self.fragments {
            doc += &lit.value();
            doc.push('\n');
        }
        doc
    }
}

impl ToTokens for Doc {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        let fragments = &self.fragments;
        tokens.extend(quote! { #(#[doc = #fragments])* });
        if self.hidden {
            tokens.extend(quote! { #[doc(hidden)] });
        }
    }
}