blob: 3d412a9341e2cd44fb0cbf7077a668b9f4c6ade6 [file]
//! Collecting fake doc items. This query is used by rustdoc to document attributes, keywords and
//! primitives.
use rustc_attr_ir::{DocAttribute, find_attr};
use rustc_middle::query::{LocalCrate, Providers};
use rustc_middle::ty::TyCtxt;
use rustc_span::def_id::{DefId, LOCAL_CRATE};
use rustc_span::sym;
/// Traverse and collect the fake doc items in the current crate
fn fake_doc_items(tcx: TyCtxt<'_>, _: LocalCrate) -> Vec<DefId> {
let mut fake_doc_items = Vec::new();
// Optimization: can this crate even define fake doc items?
let features = tcx.features().enabled_features();
if features.contains(&sym::rustc_attrs) || features.contains(&sym::rustdoc_internals) {
// Collect fake doc items in this crate.
for id in tcx.hir_root_module().item_ids {
let id = id.hir_id();
if find_attr!(
tcx,
id,
RustcDocPrimitive(..)
| Doc(DocAttribute { keyword: Some(..), .. })
| Doc(DocAttribute { attribute: Some(..), .. })
) {
fake_doc_items.push(id.expect_owner().to_def_id());
}
}
}
fake_doc_items
}
/// Traverse and collect all the fake doc items in all crates.
fn all_fake_doc_items(tcx: TyCtxt<'_>, (): ()) -> Vec<DefId> {
let mut fake_doc_items = Vec::new();
// Collect fake doc items in visible crates.
for cnum in tcx
.crates(())
.iter()
.copied()
.filter(|cnum| tcx.is_user_visible_dep(*cnum))
.chain(std::iter::once(LOCAL_CRATE))
{
fake_doc_items.extend_from_slice(tcx.fake_doc_items(cnum))
}
fake_doc_items
}
pub(crate) fn provide(providers: &mut Providers) {
providers.fake_doc_items = fake_doc_items;
providers.all_fake_doc_items = all_fake_doc_items;
}