From 73a0c79fe61f7797ed01638437d6fe3801d22058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Mon, 25 Jan 2021 22:53:00 +0100 Subject: [PATCH 01/25] build_local_trait_impl: reuse memory Co-authored-by: Joshua Nelson --- src/librustdoc/passes/collect_trait_impls.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index 6ec6620681bf5..ecfe7b4870c00 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -56,11 +56,11 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { // `tcx.crates()` doesn't include the local crate, and `tcx.all_trait_implementations` // doesn't work with it anyway, so pull them from the HIR map instead + let mut extra_attrs = Vec::new(); for &trait_did in cx.tcx.all_traits(LOCAL_CRATE).iter() { for &impl_node in cx.tcx.hir().trait_impls(trait_did) { let impl_did = cx.tcx.hir().local_def_id(impl_node); cx.tcx.sess.prof.generic_activity("build_local_trait_impl").run(|| { - let mut extra_attrs = Vec::new(); let mut parent = cx.tcx.parent(impl_did.to_def_id()); while let Some(did) = parent { extra_attrs.extend( @@ -86,6 +86,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { Some(&extra_attrs), &mut new_items, ); + extra_attrs.clear(); }); } } From 30c264631d7ea21c59a853187b3b48020e0b762a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 19:40:52 +0100 Subject: [PATCH 02/25] Cleanup: only call to_def_id once --- src/librustdoc/passes/collect_trait_impls.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index ecfe7b4870c00..a06b55fb3937b 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -59,9 +59,9 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { let mut extra_attrs = Vec::new(); for &trait_did in cx.tcx.all_traits(LOCAL_CRATE).iter() { for &impl_node in cx.tcx.hir().trait_impls(trait_did) { - let impl_did = cx.tcx.hir().local_def_id(impl_node); + let impl_did = cx.tcx.hir().local_def_id(impl_node).to_def_id(); cx.tcx.sess.prof.generic_activity("build_local_trait_impl").run(|| { - let mut parent = cx.tcx.parent(impl_did.to_def_id()); + let mut parent = cx.tcx.parent(impl_did); while let Some(did) = parent { extra_attrs.extend( cx.tcx @@ -79,13 +79,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { ); parent = cx.tcx.parent(did); } - inline::build_impl( - cx, - None, - impl_did.to_def_id(), - Some(&extra_attrs), - &mut new_items, - ); + inline::build_impl(cx, None, impl_did, Some(&extra_attrs), &mut new_items); extra_attrs.clear(); }); } From d6f80ad489e1adabbeb01cebf2f8295e264dfb9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 19:48:54 +0100 Subject: [PATCH 03/25] Use ArrayVec instead of SmallVec --- Cargo.lock | 1 + src/librustdoc/Cargo.toml | 1 + src/librustdoc/clean/types.rs | 20 ++++++++++---------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a4ba7704426e8..9149ffeded952 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4386,6 +4386,7 @@ dependencies = [ name = "rustdoc" version = "0.0.0" dependencies = [ + "arrayvec", "expect-test", "itertools 0.9.0", "minifier", diff --git a/src/librustdoc/Cargo.toml b/src/librustdoc/Cargo.toml index db64b31f31cfc..b6965898b4e44 100644 --- a/src/librustdoc/Cargo.toml +++ b/src/librustdoc/Cargo.toml @@ -8,6 +8,7 @@ edition = "2018" path = "lib.rs" [dependencies] +arrayvec = { version = "0.5.1", default-features = false } pulldown-cmark = { version = "0.8", default-features = false } minifier = "0.0.33" rayon = { version = "0.3.0", package = "rustc-rayon" } diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index bebb746c92d2f..c8fa6c54c425a 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -8,6 +8,7 @@ use std::rc::Rc; use std::sync::Arc; use std::{slice, vec}; +use arrayvec::ArrayVec; use rustc_ast::attr; use rustc_ast::util::comments::beautify_doc_string; use rustc_ast::{self as ast, AttrStyle}; @@ -28,7 +29,6 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol, SymbolStr}; use rustc_span::{self, FileName, Loc}; use rustc_target::abi::VariantIdx; use rustc_target::spec::abi::Abi; -use smallvec::{smallvec, SmallVec}; use crate::clean::cfg::Cfg; use crate::clean::external_path; @@ -1539,12 +1539,12 @@ impl PrimitiveType { } } - crate fn impls(&self, tcx: TyCtxt<'_>) -> &'static SmallVec<[DefId; 4]> { + crate fn impls(&self, tcx: TyCtxt<'_>) -> &'static ArrayVec<[DefId; 4]> { Self::all_impls(tcx).get(self).expect("missing impl for primitive type") } - crate fn all_impls(tcx: TyCtxt<'_>) -> &'static FxHashMap> { - static CELL: OnceCell>> = OnceCell::new(); + crate fn all_impls(tcx: TyCtxt<'_>) -> &'static FxHashMap> { + static CELL: OnceCell>> = OnceCell::new(); CELL.get_or_init(move || { use self::PrimitiveType::*; @@ -1568,7 +1568,7 @@ impl PrimitiveType { } let single = |a: Option| a.into_iter().collect(); - let both = |a: Option, b: Option| -> SmallVec<_> { + let both = |a: Option, b: Option| -> ArrayVec<_> { a.into_iter().chain(b).collect() }; @@ -1601,8 +1601,8 @@ impl PrimitiveType { .collect() }, Array => single(lang_items.array_impl()), - Tuple => smallvec![], - Unit => smallvec![], + Tuple => ArrayVec::new(), + Unit => ArrayVec::new(), RawPointer => { lang_items .const_ptr_impl() @@ -1612,9 +1612,9 @@ impl PrimitiveType { .chain(lang_items.mut_slice_ptr_impl()) .collect() }, - Reference => smallvec![], - Fn => smallvec![], - Never => smallvec![], + Reference => ArrayVec::new(), + Fn => ArrayVec::new(), + Never => ArrayVec::new(), } }) } From fcdaffcb8740a787fc50113c3dab7e0bfaf8d860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 20:35:06 +0100 Subject: [PATCH 04/25] Clean up build_deref_target_impls --- src/librustdoc/clean/utils.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index 50ec6e69fbd40..f9accd6b3253d 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -322,20 +322,14 @@ crate fn build_deref_target_impls(cx: &DocContext<'_>, items: &[Item], ret: &mut ItemKind::TypedefItem(ref t, true) => &t.type_, _ => continue, }; - let primitive = match *target { - ResolvedPath { did, .. } if did.is_local() => continue, - ResolvedPath { did, .. } => { - ret.extend(inline::build_impls(cx, None, did, None)); - continue; + + if let Some(prim) = target.primitive_type() { + for &did in prim.impls(tcx).iter().filter(|did| !did.is_local()) { + inline::build_impl(cx, None, did, None, ret); } - _ => match target.primitive_type() { - Some(prim) => prim, - None => continue, - }, - }; - for &did in primitive.impls(tcx) { + } else if let ResolvedPath { did, .. } = *target { if !did.is_local() { - inline::build_impl(cx, None, did, None, ret); + ret.extend(inline::build_impls(cx, None, did, None)); } } } From 0d9d9edc74bac97d43cfa70d9f50d77e1f8e55a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 20:38:36 +0100 Subject: [PATCH 05/25] Align try_inline and try_inline_glob --- src/librustdoc/clean/inline.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 1f9e7f8ae5cd4..590c2d08dea16 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -133,10 +133,7 @@ crate fn try_inline_glob( res: Res, visited: &mut FxHashSet, ) -> Option> { - if res == Res::Err { - return None; - } - let did = res.def_id(); + let did = res.opt_def_id()?; if did.is_local() { return None; } From b59efa02cfacee4799131dbba14fe19190db980a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 22:44:52 +0100 Subject: [PATCH 06/25] Avoid unnecessary re-hashing --- src/librustdoc/core.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 16f11e460e6f0..1062a3e8708f9 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -150,11 +150,9 @@ impl<'tcx> DocContext<'tcx> { let mut fake_ids = self.fake_def_ids.borrow_mut(); - let def_id = *fake_ids.entry(crate_num).or_insert(start_def_id); - fake_ids.insert( - crate_num, - DefId { krate: crate_num, index: DefIndex::from(def_id.index.index() + 1) }, - ); + let def_id = fake_ids.entry(crate_num).or_insert(start_def_id); + *def_id = DefId { krate: crate_num, index: DefIndex::from(def_id.index.index() + 1) }; + let def_id = *def_id; MAX_DEF_ID.with(|m| { m.borrow_mut().entry(def_id.krate).or_insert(start_def_id); From a9c20944da37abfcaa985ff9a8121fe9b477a79f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 22:49:57 +0100 Subject: [PATCH 07/25] Avoid writing MAX_DEF_ID --- src/librustdoc/core.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 1062a3e8708f9..73c0e551deb27 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -24,9 +24,12 @@ use rustc_span::source_map; use rustc_span::symbol::sym; use rustc_span::DUMMY_SP; -use std::cell::{Cell, RefCell}; use std::mem; use std::rc::Rc; +use std::{ + cell::{Cell, RefCell}, + collections::hash_map::Entry, +}; use crate::clean; use crate::clean::{AttributesExt, MAX_DEF_ID}; @@ -150,14 +153,18 @@ impl<'tcx> DocContext<'tcx> { let mut fake_ids = self.fake_def_ids.borrow_mut(); - let def_id = fake_ids.entry(crate_num).or_insert(start_def_id); + let def_id = match fake_ids.entry(crate_num) { + Entry::Vacant(e) => { + MAX_DEF_ID.with(|m| { + m.borrow_mut().insert(crate_num, start_def_id); + }); + e.insert(start_def_id) + } + Entry::Occupied(e) => e.into_mut(), + }; *def_id = DefId { krate: crate_num, index: DefIndex::from(def_id.index.index() + 1) }; let def_id = *def_id; - MAX_DEF_ID.with(|m| { - m.borrow_mut().entry(def_id.krate).or_insert(start_def_id); - }); - self.all_fake_def_ids.borrow_mut().insert(def_id); def_id From f0b662e728d7386ffa2f37e6c805617abb12488e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 22:54:21 +0100 Subject: [PATCH 08/25] Remove all_fake_def_ids --- src/librustdoc/core.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 73c0e551deb27..57a765608fc45 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -67,7 +67,6 @@ crate struct DocContext<'tcx> { /// Table synthetic type parameter for `impl Trait` in argument position -> bounds crate impl_trait_bounds: RefCell>>, crate fake_def_ids: RefCell>, - crate all_fake_def_ids: RefCell>, /// Auto-trait or blanket impls processed so far, as `(self_ty, trait_def_id)`. // FIXME(eddyb) make this a `ty::TraitRef<'tcx>` set. crate generated_synthetics: RefCell, DefId)>>, @@ -163,17 +162,16 @@ impl<'tcx> DocContext<'tcx> { Entry::Occupied(e) => e.into_mut(), }; *def_id = DefId { krate: crate_num, index: DefIndex::from(def_id.index.index() + 1) }; - let def_id = *def_id; - self.all_fake_def_ids.borrow_mut().insert(def_id); - - def_id + *def_id } /// Like `hir().local_def_id_to_hir_id()`, but skips calling it on fake DefIds. /// (This avoids a slice-index-out-of-bounds panic.) crate fn as_local_hir_id(&self, def_id: DefId) -> Option { - if self.all_fake_def_ids.borrow().contains(&def_id) { + if MAX_DEF_ID.with(|m| { + m.borrow().get(&def_id.krate).map(|id| id.index <= def_id.index).unwrap_or(false) + }) { None } else { def_id.as_local().map(|def_id| self.tcx.hir().local_def_id_to_hir_id(def_id)) @@ -522,7 +520,6 @@ crate fn run_global_ctxt( ct_substs: Default::default(), impl_trait_bounds: Default::default(), fake_def_ids: Default::default(), - all_fake_def_ids: Default::default(), generated_synthetics: Default::default(), auto_traits: tcx .all_traits(LOCAL_CRATE) From 90ef94e73957cc602a28ecf92eec4c201acd1309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 22:59:26 +0100 Subject: [PATCH 09/25] Only calculate the start_def_id if necessary --- src/librustdoc/core.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 57a765608fc45..c741f9082c307 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -140,20 +140,20 @@ impl<'tcx> DocContext<'tcx> { /// [`Debug`]: std::fmt::Debug /// [`clean::Item`]: crate::clean::types::Item crate fn next_def_id(&self, crate_num: CrateNum) -> DefId { - let start_def_id = { - let num_def_ids = if crate_num == LOCAL_CRATE { - self.tcx.hir().definitions().def_path_table().num_def_ids() - } else { - self.enter_resolver(|r| r.cstore().num_def_ids(crate_num)) - }; - - DefId { krate: crate_num, index: DefIndex::from_usize(num_def_ids) } - }; - let mut fake_ids = self.fake_def_ids.borrow_mut(); let def_id = match fake_ids.entry(crate_num) { Entry::Vacant(e) => { + let start_def_id = { + let num_def_ids = if crate_num == LOCAL_CRATE { + self.tcx.hir().definitions().def_path_table().num_def_ids() + } else { + self.enter_resolver(|r| r.cstore().num_def_ids(crate_num)) + }; + + DefId { krate: crate_num, index: DefIndex::from_usize(num_def_ids) } + }; + MAX_DEF_ID.with(|m| { m.borrow_mut().insert(crate_num, start_def_id); }); From 76cd3ba151d8d3edaf0a1461946136ed14d840d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 23:36:07 +0100 Subject: [PATCH 10/25] No need to store crate num twice --- src/librustdoc/clean/types.rs | 8 ++++---- src/librustdoc/core.rs | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index c8fa6c54c425a..18683f6809f44 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -17,7 +17,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_feature::UnstableFeatures; use rustc_hir as hir; use rustc_hir::def::{CtorKind, Res}; -use rustc_hir::def_id::{CrateNum, DefId}; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex}; use rustc_hir::lang_items::LangItem; use rustc_hir::Mutability; use rustc_index::vec::IndexVec; @@ -45,7 +45,7 @@ use self::ItemKind::*; use self::SelfTy::*; use self::Type::*; -thread_local!(crate static MAX_DEF_ID: RefCell> = Default::default()); +thread_local!(crate static MAX_DEF_IDX: RefCell> = Default::default()); #[derive(Clone, Debug)] crate struct Crate { @@ -293,8 +293,8 @@ impl Item { /// /// [`next_def_id()`]: DocContext::next_def_id() crate fn is_fake(&self) -> bool { - MAX_DEF_ID.with(|m| { - m.borrow().get(&self.def_id.krate).map(|id| self.def_id >= *id).unwrap_or(false) + MAX_DEF_IDX.with(|m| { + m.borrow().get(&self.def_id.krate).map(|&idx| idx <= self.def_id.index).unwrap_or(false) }) } } diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index c741f9082c307..8eea102fa2fdb 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -32,7 +32,7 @@ use std::{ }; use crate::clean; -use crate::clean::{AttributesExt, MAX_DEF_ID}; +use crate::clean::{AttributesExt, MAX_DEF_IDX}; use crate::config::{Options as RustdocOptions, RenderOptions}; use crate::config::{OutputFormat, RenderInfo}; use crate::formats::cache::Cache; @@ -66,7 +66,7 @@ crate struct DocContext<'tcx> { crate ct_substs: RefCell>, /// Table synthetic type parameter for `impl Trait` in argument position -> bounds crate impl_trait_bounds: RefCell>>, - crate fake_def_ids: RefCell>, + crate fake_def_ids: RefCell>, /// Auto-trait or blanket impls processed so far, as `(self_ty, trait_def_id)`. // FIXME(eddyb) make this a `ty::TraitRef<'tcx>` set. crate generated_synthetics: RefCell, DefId)>>, @@ -142,35 +142,35 @@ impl<'tcx> DocContext<'tcx> { crate fn next_def_id(&self, crate_num: CrateNum) -> DefId { let mut fake_ids = self.fake_def_ids.borrow_mut(); - let def_id = match fake_ids.entry(crate_num) { + let def_index = match fake_ids.entry(crate_num) { Entry::Vacant(e) => { - let start_def_id = { - let num_def_ids = if crate_num == LOCAL_CRATE { + let num_def_idx = { + let num_def_idx = if crate_num == LOCAL_CRATE { self.tcx.hir().definitions().def_path_table().num_def_ids() } else { self.enter_resolver(|r| r.cstore().num_def_ids(crate_num)) }; - DefId { krate: crate_num, index: DefIndex::from_usize(num_def_ids) } + DefIndex::from_usize(num_def_idx) }; - MAX_DEF_ID.with(|m| { - m.borrow_mut().insert(crate_num, start_def_id); + MAX_DEF_IDX.with(|m| { + m.borrow_mut().insert(crate_num, num_def_idx); }); - e.insert(start_def_id) + e.insert(num_def_idx) } Entry::Occupied(e) => e.into_mut(), }; - *def_id = DefId { krate: crate_num, index: DefIndex::from(def_id.index.index() + 1) }; + *def_index = DefIndex::from(*def_index + 1); - *def_id + DefId { krate: crate_num, index: *def_index } } /// Like `hir().local_def_id_to_hir_id()`, but skips calling it on fake DefIds. /// (This avoids a slice-index-out-of-bounds panic.) crate fn as_local_hir_id(&self, def_id: DefId) -> Option { - if MAX_DEF_ID.with(|m| { - m.borrow().get(&def_id.krate).map(|id| id.index <= def_id.index).unwrap_or(false) + if MAX_DEF_IDX.with(|m| { + m.borrow().get(&def_id.krate).map(|&idx| idx <= def_id.index).unwrap_or(false) }) { None } else { From b56c383b14635d7b856ed3ba8dfa316b8486cd65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Tue, 26 Jan 2021 19:29:25 +0100 Subject: [PATCH 11/25] Use drain to avoid moving elements of the vector twice --- src/librustdoc/passes/collect_trait_impls.rs | 29 +++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index a06b55fb3937b..6f992b3a916ee 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -132,25 +132,28 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { } } - new_items.retain(|it| { - if let ImplItem(Impl { ref for_, ref trait_, ref blanket_impl, .. }) = *it.kind { - cleaner.keep_impl(for_) - || trait_.as_ref().map_or(false, |t| cleaner.keep_impl(t)) - || blanket_impl.is_some() - } else { - true - } - }); - - if let Some(ref mut it) = krate.module { + let items = if let Some(ref mut it) = krate.module { if let ModuleItem(Module { ref mut items, .. }) = *it.kind { - items.extend(synth.impls); - items.extend(new_items); + items } else { panic!("collect-trait-impls can't run"); } } else { panic!("collect-trait-impls can't run"); + }; + + items.extend(synth.impls); + for it in new_items.drain(..) { + if let ImplItem(Impl { ref for_, ref trait_, ref blanket_impl, .. }) = *it.kind { + if !(cleaner.keep_impl(for_) + || trait_.as_ref().map_or(false, |t| cleaner.keep_impl(t)) + || blanket_impl.is_some()) + { + continue; + } + } + + items.push(it); } krate From 3b71d3aea96ada9f180d3bc95b0108a2c3a46d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Wed, 27 Jan 2021 08:39:48 +0100 Subject: [PATCH 12/25] Pass result vec into build_impls --- src/librustdoc/clean/inline.rs | 20 +++++++++----------- src/librustdoc/clean/utils.rs | 2 +- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 590c2d08dea16..2588c00f2cffd 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -56,7 +56,7 @@ crate fn try_inline( let kind = match res { Res::Def(DefKind::Trait, did) => { record_extern_fqn(cx, did, clean::TypeKind::Trait); - ret.extend(build_impls(cx, Some(parent_module), did, attrs)); + build_impls(cx, Some(parent_module), did, attrs, &mut ret); clean::TraitItem(build_external_trait(cx, did)) } Res::Def(DefKind::Fn, did) => { @@ -65,27 +65,27 @@ crate fn try_inline( } Res::Def(DefKind::Struct, did) => { record_extern_fqn(cx, did, clean::TypeKind::Struct); - ret.extend(build_impls(cx, Some(parent_module), did, attrs)); + build_impls(cx, Some(parent_module), did, attrs, &mut ret); clean::StructItem(build_struct(cx, did)) } Res::Def(DefKind::Union, did) => { record_extern_fqn(cx, did, clean::TypeKind::Union); - ret.extend(build_impls(cx, Some(parent_module), did, attrs)); + build_impls(cx, Some(parent_module), did, attrs, &mut ret); clean::UnionItem(build_union(cx, did)) } Res::Def(DefKind::TyAlias, did) => { record_extern_fqn(cx, did, clean::TypeKind::Typedef); - ret.extend(build_impls(cx, Some(parent_module), did, attrs)); + build_impls(cx, Some(parent_module), did, attrs, &mut ret); clean::TypedefItem(build_type_alias(cx, did), false) } Res::Def(DefKind::Enum, did) => { record_extern_fqn(cx, did, clean::TypeKind::Enum); - ret.extend(build_impls(cx, Some(parent_module), did, attrs)); + build_impls(cx, Some(parent_module), did, attrs, &mut ret); clean::EnumItem(build_enum(cx, did)) } Res::Def(DefKind::ForeignTy, did) => { record_extern_fqn(cx, did, clean::TypeKind::Foreign); - ret.extend(build_impls(cx, Some(parent_module), did, attrs)); + build_impls(cx, Some(parent_module), did, attrs, &mut ret); clean::ForeignTypeItem } // Never inline enum variants but leave them shown as re-exports. @@ -277,16 +277,14 @@ crate fn build_impls( parent_module: Option, did: DefId, attrs: Option>, -) -> Vec { + ret: &mut Vec, +) { let tcx = cx.tcx; - let mut impls = Vec::new(); // for each implementation of an item represented by `did`, build the clean::Item for that impl for &did in tcx.inherent_impls(did).iter() { - build_impl(cx, parent_module, did, attrs, &mut impls); + build_impl(cx, parent_module, did, attrs, ret); } - - impls } /// `parent_module` refers to the parent of the re-export, not the original item diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index f9accd6b3253d..ce8e0cf981c38 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -329,7 +329,7 @@ crate fn build_deref_target_impls(cx: &DocContext<'_>, items: &[Item], ret: &mut } } else if let ResolvedPath { did, .. } = *target { if !did.is_local() { - ret.extend(inline::build_impls(cx, None, did, None)); + inline::build_impls(cx, None, did, None, ret); } } } From a137c23e7aa23a92b6167adf74459aa32b1b2b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Wed, 27 Jan 2021 15:58:49 +0100 Subject: [PATCH 13/25] Don't copy file contents just to remove the BOM --- src/librustdoc/html/highlight.rs | 2 +- src/librustdoc/html/markdown.rs | 2 +- src/librustdoc/html/render/mod.rs | 2 +- src/librustdoc/html/sources.rs | 9 ++++----- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs index d21998bb8cfe5..c320fd58b4e82 100644 --- a/src/librustdoc/html/highlight.rs +++ b/src/librustdoc/html/highlight.rs @@ -17,7 +17,7 @@ use rustc_span::with_default_session_globals; /// Highlights `src`, returning the HTML output. crate fn render_with_highlighting( - src: String, + src: &str, class: Option<&str>, playground_button: Option<&str>, tooltip: Option<(Option, &str)>, diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index 7c8b76be374a8..d10e21aaeaaa4 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -299,7 +299,7 @@ impl<'a, I: Iterator>> Iterator for CodeBlocks<'_, 'a, I> { }; s.push_str(&highlight::render_with_highlighting( - text, + &text, Some(&format!( "rust-example-rendered{}", if let Some((_, class)) = tooltip { format!(" {}", class) } else { String::new() } diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index df3701487d797..a4fb89bab0523 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -4785,7 +4785,7 @@ fn sidebar_foreign_type(cx: &Context<'_>, buf: &mut Buffer, it: &clean::Item) { fn item_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Macro) { wrap_into_docblock(w, |w| { w.write_str(&highlight::render_with_highlighting( - t.source.clone(), + &t.source, Some("macro"), None, None, diff --git a/src/librustdoc/html/sources.rs b/src/librustdoc/html/sources.rs index ac07aeb8bc8b7..da66ae13377c0 100644 --- a/src/librustdoc/html/sources.rs +++ b/src/librustdoc/html/sources.rs @@ -86,7 +86,7 @@ impl SourceCollector<'_, '_> { return Ok(()); } - let mut contents = match fs::read_to_string(&p) { + let contents = match fs::read_to_string(&p) { Ok(contents) => contents, Err(e) => { return Err(Error::new(e, &p)); @@ -94,9 +94,8 @@ impl SourceCollector<'_, '_> { }; // Remove the utf-8 BOM if any - if contents.starts_with('\u{feff}') { - contents.drain(..3); - } + let contents = + if contents.starts_with('\u{feff}') { &contents[3..] } else { &contents[..] }; // Create the intermediate directories let mut cur = self.dst.clone(); @@ -171,7 +170,7 @@ where /// Wrapper struct to render the source code of a file. This will do things like /// adding line numbers to the left-hand side. -fn print_src(buf: &mut Buffer, s: String, edition: Edition) { +fn print_src(buf: &mut Buffer, s: &str, edition: Edition) { let lines = s.lines().count(); let mut cols = 0; let mut tmp = lines; From 4398750fed95dc58bbc34386e7531914ba85177d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Wed, 27 Jan 2021 16:09:34 +0100 Subject: [PATCH 14/25] Don't pre-concatenate path --- src/librustdoc/html/layout.rs | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/librustdoc/html/layout.rs b/src/librustdoc/html/layout.rs index c6ff4b57a6e59..e5a686bd07d07 100644 --- a/src/librustdoc/html/layout.rs +++ b/src/librustdoc/html/layout.rs @@ -114,7 +114,6 @@ crate fn render( {after_content}\
\ - {static_extra_scripts}\ {extra_scripts}\ \ \ @@ -135,22 +134,23 @@ crate fn render( root_path = page.root_path, css_class = page.css_class, logo = { - let p = format!("{}{}", page.root_path, layout.krate); - let p = ensure_trailing_slash(&p); if layout.logo.is_empty() { format!( - "\ + "\ ", - path = p, + root = page.root_path, + path = ensure_trailing_slash(&layout.krate), static_root_path = static_root_path, suffix = page.resource_suffix ) } else { format!( - "\ -
logo
", - p, layout.logo + "\ +
logo
", + root = page.root_path, + path = ensure_trailing_slash(&layout.krate), + logo = layout.logo ) } }, @@ -194,7 +194,7 @@ crate fn render( )) .collect::(), suffix = page.resource_suffix, - static_extra_scripts = page + extra_scripts = page .static_extra_scripts .iter() .map(|e| { @@ -204,17 +204,13 @@ crate fn render( extra_script = e ) }) - .collect::(), - extra_scripts = page - .extra_scripts - .iter() - .map(|e| { + .chain(page.extra_scripts.iter().map(|e| { format!( "", root_path = page.root_path, extra_script = e ) - }) + })) .collect::(), filter_crates = if layout.generate_search_filter { "