]> git.lizzy.rs Git - rust.git/blob - src/librustdoc/passes/propagate_doc_cfg.rs
Auto merge of #93081 - nikic:aarch64-fix, r=cuviper
[rust.git] / src / librustdoc / passes / propagate_doc_cfg.rs
1 //! Propagates [`#[doc(cfg(...))]`](https://github.com/rust-lang/rust/issues/43781) to child items.
2 use std::sync::Arc;
3
4 use crate::clean::cfg::Cfg;
5 use crate::clean::{Crate, Item};
6 use crate::core::DocContext;
7 use crate::fold::DocFolder;
8 use crate::passes::Pass;
9
10 crate const PROPAGATE_DOC_CFG: Pass = Pass {
11     name: "propagate-doc-cfg",
12     run: propagate_doc_cfg,
13     description: "propagates `#[doc(cfg(...))]` to child items",
14 };
15
16 crate fn propagate_doc_cfg(cr: Crate, _: &mut DocContext<'_>) -> Crate {
17     CfgPropagator { parent_cfg: None }.fold_crate(cr)
18 }
19
20 struct CfgPropagator {
21     parent_cfg: Option<Arc<Cfg>>,
22 }
23
24 impl DocFolder for CfgPropagator {
25     fn fold_item(&mut self, mut item: Item) -> Option<Item> {
26         let old_parent_cfg = self.parent_cfg.clone();
27
28         let new_cfg = match (self.parent_cfg.take(), item.cfg.take()) {
29             (None, None) => None,
30             (Some(rc), None) | (None, Some(rc)) => Some(rc),
31             (Some(mut a), Some(b)) => {
32                 let b = Arc::try_unwrap(b).unwrap_or_else(|rc| Cfg::clone(&rc));
33                 *Arc::make_mut(&mut a) &= b;
34                 Some(a)
35             }
36         };
37         self.parent_cfg = new_cfg.clone();
38         item.cfg = new_cfg;
39
40         let result = self.fold_item_recur(item);
41         self.parent_cfg = old_parent_cfg;
42
43         Some(result)
44     }
45 }