diff options
| author | zredb <zredb@163.com> | 2022-01-10 12:55:21 +0800 |
|---|---|---|
| committer | Guillaume Gomez <guillaume.gomez@huawei.com> | 2022-01-17 13:41:59 +0100 |
| commit | 0dd2703f8a3f8022da1943cdfc3e53df93f5c896 (patch) | |
| tree | 84e95c485a58925e931354390a83c5dc55b3374f | |
| parent | ff88b59e58a03dc142e80f35f4ce6177e07ad8ba (diff) | |
| download | rust-0dd2703f8a3f8022da1943cdfc3e53df93f5c896.tar.gz rust-0dd2703f8a3f8022da1943cdfc3e53df93f5c896.zip | |
fix #90187
| -rw-r--r-- | src/librustdoc/clean/types.rs | 1 | ||||
| -rw-r--r-- | src/librustdoc/formats/cache.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/html/render/search_index.rs | 23 | ||||
| -rw-r--r-- | src/librustdoc/passes/collect_trait_impls.rs | 12 | ||||
| -rw-r--r-- | src/librustdoc/passes/strip_hidden.rs | 4 | ||||
| -rw-r--r-- | src/librustdoc/passes/strip_private.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/passes/stripper.rs | 1 |
7 files changed, 30 insertions, 15 deletions
diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 00c6e38839f..125afb2192c 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -338,6 +338,7 @@ impl ExternalCrate { } /// Indicates where an external crate can be found. +#[derive(Debug)] crate enum ExternalLocation { /// Remote URL root of the external crate Remote(String), diff --git a/src/librustdoc/formats/cache.rs b/src/librustdoc/formats/cache.rs index 53159709586..c9aa3263739 100644 --- a/src/librustdoc/formats/cache.rs +++ b/src/librustdoc/formats/cache.rs @@ -25,7 +25,7 @@ use crate::html::render::IndexItem; /// to be a fairly large and expensive structure to clone. Instead this adheres /// to `Send` so it may be stored in an `Arc` instance and shared among the various /// rendering threads. -#[derive(Default)] +#[derive(Default, Debug)] crate struct Cache { /// Maps a type ID to all known implementations for that type. This is only /// recognized for intra-crate [`clean::Type::Path`]s, and is used to print diff --git a/src/librustdoc/html/render/search_index.rs b/src/librustdoc/html/render/search_index.rs index 0b6eeb51825..fa965ded176 100644 --- a/src/librustdoc/html/render/search_index.rs +++ b/src/librustdoc/html/render/search_index.rs @@ -248,12 +248,14 @@ fn add_generics_and_bounds_as_types<'tcx>( tcx: TyCtxt<'tcx>, recurse: usize, res: &mut Vec<TypeWithKind>, + cache: &Cache, ) { fn insert_ty( res: &mut Vec<TypeWithKind>, tcx: TyCtxt<'_>, ty: Type, mut generics: Vec<TypeWithKind>, + cache: &Cache, ) { let is_full_generic = ty.is_full_generic(); @@ -347,6 +349,7 @@ fn add_generics_and_bounds_as_types<'tcx>( tcx, recurse + 1, &mut ty_generics, + cache, ) } _ => {} @@ -354,7 +357,7 @@ fn add_generics_and_bounds_as_types<'tcx>( } } } - insert_ty(res, tcx, arg.clone(), ty_generics); + insert_ty(res, tcx, arg.clone(), ty_generics, cache); } // Otherwise we check if the trait bounds are "inlined" like `T: Option<u32>`... if let Some(bound) = generics.params.iter().find(|g| g.is_type() && g.name == arg_s) { @@ -368,10 +371,11 @@ fn add_generics_and_bounds_as_types<'tcx>( tcx, recurse + 1, &mut ty_generics, + cache, ); } } - insert_ty(res, tcx, arg.clone(), ty_generics); + insert_ty(res, tcx, arg.clone(), ty_generics, cache); } } else { // This is not a type parameter. So for example if we have `T, U: Option<T>`, and we're @@ -382,10 +386,17 @@ fn add_generics_and_bounds_as_types<'tcx>( let mut ty_generics = Vec::new(); if let Some(arg_generics) = arg.generics() { for gen in arg_generics.iter() { - add_generics_and_bounds_as_types(generics, gen, tcx, recurse + 1, &mut ty_generics); + add_generics_and_bounds_as_types( + generics, + gen, + tcx, + recurse + 1, + &mut ty_generics, + cache, + ); } } - insert_ty(res, tcx, arg.clone(), ty_generics); + insert_ty(res, tcx, arg.clone(), ty_generics, cache); } } @@ -407,7 +418,7 @@ fn get_fn_inputs_and_outputs<'tcx>( continue; } let mut args = Vec::new(); - add_generics_and_bounds_as_types(generics, &arg.type_, tcx, 0, &mut args); + add_generics_and_bounds_as_types(generics, &arg.type_, tcx, 0, &mut args, cache); if !args.is_empty() { all_types.extend(args); } else { @@ -420,7 +431,7 @@ fn get_fn_inputs_and_outputs<'tcx>( let mut ret_types = Vec::new(); match decl.output { FnRetTy::Return(ref return_type) => { - add_generics_and_bounds_as_types(generics, return_type, tcx, 0, &mut ret_types); + add_generics_and_bounds_as_types(generics, return_type, tcx, 0, &mut ret_types, cache); if ret_types.is_empty() { if let Some(kind) = return_type.def_id(cache).map(|did| tcx.def_kind(did).into()) { ret_types.push(TypeWithKind::from((get_index_type(return_type, vec![]), kind))); diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index fd52d93cb38..7c6559bf01d 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -4,6 +4,7 @@ use super::Pass; use crate::clean::*; use crate::core::DocContext; +use crate::formats::cache::Cache; use crate::visit::DocVisitor; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; @@ -57,14 +58,14 @@ crate fn collect_trait_impls(mut krate: Crate, cx: &mut DocContext<'_>) -> Crate } }); - let mut cleaner = BadImplStripper { prims, items: crate_items }; + let mut cleaner = BadImplStripper { prims, items: crate_items, cache: &cx.cache }; let mut type_did_to_deref_target: FxHashMap<DefId, &Type> = FxHashMap::default(); // Follow all `Deref` targets of included items and recursively add them as valid fn add_deref_target( cx: &DocContext<'_>, map: &FxHashMap<DefId, &Type>, - cleaner: &mut BadImplStripper, + cleaner: &mut BadImplStripper<'_>, type_did: DefId, ) { if let Some(target) = map.get(&type_did) { @@ -204,19 +205,20 @@ impl DocVisitor for ItemCollector { } } -struct BadImplStripper { +struct BadImplStripper<'a> { prims: FxHashSet<PrimitiveType>, items: FxHashSet<ItemId>, + crate cache: &'a Cache, } -impl BadImplStripper { +impl<'a> BadImplStripper<'a> { fn keep_impl(&self, ty: &Type, is_deref: bool) -> bool { if let Generic(_) = ty { // keep impls made on generics true } else if let Some(prim) = ty.primitive_type() { self.prims.contains(&prim) - } else if let Some(did) = ty.def_id(&cx.cache) { + } else if let Some(did) = ty.def_id(self.cache) { is_deref || self.keep_impl_with_def_id(did.into()) } else { false diff --git a/src/librustdoc/passes/strip_hidden.rs b/src/librustdoc/passes/strip_hidden.rs index e63534659ad..e7a99ee7bfd 100644 --- a/src/librustdoc/passes/strip_hidden.rs +++ b/src/librustdoc/passes/strip_hidden.rs @@ -15,7 +15,7 @@ crate const STRIP_HIDDEN: Pass = Pass { }; /// Strip items marked `#[doc(hidden)]` -crate fn strip_hidden(krate: clean::Crate, _: &mut DocContext<'_>) -> clean::Crate { +crate fn strip_hidden(krate: clean::Crate, cx: &mut DocContext<'_>) -> clean::Crate { let mut retained = ItemIdSet::default(); // strip all #[doc(hidden)] items @@ -25,7 +25,7 @@ crate fn strip_hidden(krate: clean::Crate, _: &mut DocContext<'_>) -> clean::Cra }; // strip all impls referencing stripped items - let mut stripper = ImplStripper { retained: &retained }; + let mut stripper = ImplStripper { retained: &retained, cache: &cx.cache }; stripper.fold_crate(krate) } diff --git a/src/librustdoc/passes/strip_private.rs b/src/librustdoc/passes/strip_private.rs index c6b5bec4692..ef7e768a511 100644 --- a/src/librustdoc/passes/strip_private.rs +++ b/src/librustdoc/passes/strip_private.rs @@ -29,6 +29,6 @@ crate fn strip_private(mut krate: clean::Crate, cx: &mut DocContext<'_>) -> clea } // strip all impls referencing private items - let mut stripper = ImplStripper { retained: &retained }; + let mut stripper = ImplStripper { retained: &retained, cache: &cx.cache }; stripper.fold_crate(krate) } diff --git a/src/librustdoc/passes/stripper.rs b/src/librustdoc/passes/stripper.rs index ed0b2c0a5d7..4701d7f3e14 100644 --- a/src/librustdoc/passes/stripper.rs +++ b/src/librustdoc/passes/stripper.rs @@ -5,6 +5,7 @@ use std::mem; use crate::clean::{self, Item, ItemIdSet}; use crate::fold::{strip_item, DocFolder}; +use crate::formats::cache::Cache; crate struct Stripper<'a> { crate retained: &'a mut ItemIdSet, |
