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
use rustc_hir::def_id::DefIdSet;

use crate::{
    clean::{self, Import, ImportSource, Item},
    fold::DocFolder,
};

/// Get the id's of all items that are `pub use`d in the crate.
///
/// We need this to know if a stripped module is `pub use mod::*`, to decide
/// if it needs to be kept in the index, despite being stripped.
///
/// See [#100973](https://github.com/rust-lang/rust/issues/100973) and
/// [#101103](https://github.com/rust-lang/rust/issues/101103) for times when
/// this information is needed.
pub(crate) fn get_imports(krate: clean::Crate) -> (clean::Crate, DefIdSet) {
    let mut finder = ImportFinder::default();
    let krate = finder.fold_crate(krate);
    (krate, finder.imported)
}

#[derive(Default)]
struct ImportFinder {
    imported: DefIdSet,
}

impl DocFolder for ImportFinder {
    fn fold_item(&mut self, i: Item) -> Option<Item> {
        match *i.kind {
            clean::ImportItem(Import { source: ImportSource { did: Some(did), .. }, .. }) => {
                self.imported.insert(did);
                Some(i)
            }

            _ => Some(self.fold_item_recur(i)),
        }
    }
}