blob: a078eec048ece50dc7dc1cd7dc5a2a5dd929f266 [file] [log] [blame]
use rustc_middle::ty::{TyCtxt, Visibility};
use crate::clean;
use crate::clean::Item;
use crate::core::DocContext;
use crate::fold::{DocFolder, strip_item};
use crate::passes::Pass;
pub(crate) const STRIP_ALIASED_NON_LOCAL: Pass = Pass {
name: "strip-aliased-non-local",
run: Some(strip_aliased_non_local),
description: "strips all non-local private aliased items from the output",
};
fn strip_aliased_non_local(krate: clean::Crate, cx: &mut DocContext<'_>) -> clean::Crate {
let mut stripper = AliasedNonLocalStripper { tcx: cx.tcx };
stripper.fold_crate(krate)
}
struct AliasedNonLocalStripper<'tcx> {
tcx: TyCtxt<'tcx>,
}
impl<'tcx> DocFolder for AliasedNonLocalStripper<'tcx> {
fn fold_item(&mut self, i: Item) -> Option<Item> {
Some(match i.kind {
clean::TypeAliasItem(..) => {
let mut stripper = NonLocalStripper { tcx: self.tcx };
// don't call `fold_item` as that could strip the type-alias it-self
// which we don't want to strip out
stripper.fold_item_recur(i)
}
_ => self.fold_item_recur(i),
})
}
}
struct NonLocalStripper<'tcx> {
tcx: TyCtxt<'tcx>,
}
impl<'tcx> DocFolder for NonLocalStripper<'tcx> {
fn fold_item(&mut self, i: Item) -> Option<Item> {
// If not local, we want to respect the original visibility of
// the field and not the one given by the user for the currrent crate.
//
// FIXME(#125009): Not-local should probably consider same Cargo workspace
if let Some(def_id) = i.def_id()
&& !def_id.is_local()
{
if i.is_doc_hidden()
// Default to *not* stripping items with inherited visibility.
|| i.visibility(self.tcx).map_or(false, |viz| viz != Visibility::Public)
{
return Some(strip_item(i));
}
}
Some(self.fold_item_recur(i))
}
}