1 use crate::clean::{self, DocFragment, Item};
2 use crate::core::DocContext;
4 use crate::fold::DocFolder;
5 use crate::passes::Pass;
9 pub const COLLAPSE_DOCS: Pass = Pass {
10 name: "collapse-docs",
12 description: "concatenates all document attributes into one document attribute",
15 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
16 enum DocFragmentKind {
23 fn kind(&self) -> DocFragmentKind {
25 DocFragment::SugaredDoc(..) => DocFragmentKind::Sugared,
26 DocFragment::RawDoc(..) => DocFragmentKind::Raw,
27 DocFragment::Include(..) => DocFragmentKind::Include,
32 pub fn collapse_docs(krate: clean::Crate, _: &DocContext<'_>) -> clean::Crate {
33 let mut krate = Collapser.fold_crate(krate);
34 krate.collapsed = true;
40 impl fold::DocFolder for Collapser {
41 fn fold_item(&mut self, mut i: Item) -> Option<Item> {
42 i.attrs.collapse_doc_comments();
43 self.fold_item_recur(i)
47 fn collapse(doc_strings: &mut Vec<DocFragment>) {
48 let mut docs = vec![];
49 let mut last_frag: Option<DocFragment> = None;
51 for frag in take(doc_strings) {
52 if let Some(mut curr_frag) = last_frag.take() {
53 let curr_kind = curr_frag.kind();
54 let new_kind = frag.kind();
56 if curr_kind == DocFragmentKind::Include || curr_kind != new_kind {
58 DocFragment::SugaredDoc(_, _, ref mut doc_string)
59 | DocFragment::RawDoc(_, _, ref mut doc_string) => {
60 // add a newline for extra padding between segments
61 doc_string.push('\n');
66 last_frag = Some(frag);
69 DocFragment::SugaredDoc(_, ref mut span, ref mut doc_string)
70 | DocFragment::RawDoc(_, ref mut span, ref mut doc_string) => {
71 doc_string.push('\n');
72 doc_string.push_str(frag.as_str());
73 *span = span.to(frag.span());
77 last_frag = Some(curr_frag);
80 last_frag = Some(frag);
84 if let Some(frag) = last_frag.take() {
90 impl clean::Attributes {
91 pub fn collapse_doc_comments(&mut self) {
92 collapse(&mut self.doc_strings);