From 53d7f95e206b7076a1a62c7cee5196658f4e9eb7 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sat, 26 Mar 2022 00:35:26 -0500 Subject: [PATCH] [wip] try to process impl blocks in collect pass aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh this is so curseeeeeeed currently failing: - rustdoc/doc-cfg-simplification.rs - rustdoc/intra-doc-crate/self.rs --- src/librustdoc/core.rs | 2 ++ src/librustdoc/formats/cache.rs | 19 +++++++++++++++++-- src/librustdoc/formats/mod.rs | 1 + src/librustdoc/visit.rs | 5 ----- .../rustdoc-ui/assoc-item-not-in-scope.stderr | 19 +------------------ src/tools/compiletest/src/runtest.rs | 1 + 6 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 1ee652b74b686..041f5c75debd5 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -467,6 +467,8 @@ crate fn run_global_ctxt( rustc_errors::FatalError.raise(); } + ctxt.cache.populate_impls(&krate); + (krate, ctxt.render_options, ctxt.cache) } diff --git a/src/librustdoc/formats/cache.rs b/src/librustdoc/formats/cache.rs index 9d360a070b55a..ac48c9e798f43 100644 --- a/src/librustdoc/formats/cache.rs +++ b/src/librustdoc/formats/cache.rs @@ -179,9 +179,17 @@ impl Cache { } } } + // god what a mess + *krate.external_traits.borrow_mut() = mem::take(&mut cx.cache.traits); krate } + + /// `external_trats` / `cache.traits` is modified in various passes. + /// Run this separate from the main `populate` call, since `impls` isn't used until later in the HTML formatter. + crate fn populate_impls(&mut self, krate: &clean::Crate) { + self.traits = krate.external_traits.take(); + } } impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> { @@ -462,7 +470,7 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> { } } } - let impl_item = Impl { impl_item: item.clone() }; + let impl_item = Impl { impl_item: item }; if impl_item.trait_did().map_or(true, |d| self.cache.traits.contains_key(&d)) { for did in dids { self.cache.impls.entry(did).or_insert_with(Vec::new).push(impl_item.clone()); @@ -472,7 +480,14 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> { self.cache.orphan_trait_impls.push((trait_did, dids, impl_item.clone())); } // TODO: stripping this from `Module` seems ... not great - Some(impl_item.impl_item) + // None + let item = impl_item.impl_item; + if item.def_id.is_local() { + debug!("propagating impl {:?}", item); + Some(item) + } else { + None + } } else { Some(item) }; diff --git a/src/librustdoc/formats/mod.rs b/src/librustdoc/formats/mod.rs index 4f0c5a9edee71..123ecdbf5ee8c 100644 --- a/src/librustdoc/formats/mod.rs +++ b/src/librustdoc/formats/mod.rs @@ -25,6 +25,7 @@ crate enum RenderMode { /// Metadata about implementations for a type or trait. #[derive(Clone, Debug)] +// TODO: this should not exist crate struct Impl { crate impl_item: clean::Item, } diff --git a/src/librustdoc/visit.rs b/src/librustdoc/visit.rs index 2977218529544..44cee081be9c3 100644 --- a/src/librustdoc/visit.rs +++ b/src/librustdoc/visit.rs @@ -56,11 +56,6 @@ crate trait DocVisitor: Sized { fn visit_mod(&mut self, m: &Module) { m.items.iter().for_each(|i| self.visit_item(i)); - // for i in self.cache.impls { - // if m.def_id() == find_nearest_parent_module(self.tcx, i.def_id) { - // self.visit_item(i); - // } - // } } fn visit_crate(&mut self, c: &Crate) { diff --git a/src/test/rustdoc-ui/assoc-item-not-in-scope.stderr b/src/test/rustdoc-ui/assoc-item-not-in-scope.stderr index 40cdeb5a9155f..04594ad414250 100644 --- a/src/test/rustdoc-ui/assoc-item-not-in-scope.stderr +++ b/src/test/rustdoc-ui/assoc-item-not-in-scope.stderr @@ -1,20 +1,3 @@ -warning: documentation for `f` links to item `S::fmt` which will not have documentation generated - --> $DIR/assoc-item-not-in-scope.rs:12:18 - | -LL | /// Link to [`S::fmt`] - | ^^^^^^^^ this item is will not be documented - | - = note: `#[warn(rustdoc::private_intra_doc_links)]` on by default - = note: `S::fmt` may be in a private module with all re-exports marked as `#[doc(no_inline)]` - -warning: documentation for `f` links to item `S::fmt` which will not have documentation generated - --> $DIR/assoc-item-not-in-scope.rs:20:18 - | -LL | /// Link to [`S::fmt`] - | ^^^^^^^^ this item is will not be documented - | - = note: `S::fmt` may be in a private module with all re-exports marked as `#[doc(no_inline)]` - error: unresolved link to `S::fmt` --> $DIR/assoc-item-not-in-scope.rs:4:15 | @@ -27,5 +10,5 @@ note: the lint level is defined here LL | #![deny(rustdoc::broken_intra_doc_links)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to previous error; 2 warnings emitted +error: aborting due to previous error diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 6b27d1ecbf550..77c265ca6af60 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -1490,6 +1490,7 @@ impl<'test> TestCx<'test> { .arg(out_dir) .arg("--deny") .arg("warnings") + .arg("-Arustdoc::private-intra-doc-links") .arg(&self.testpaths.file) .args(&self.props.compile_flags);