Skip to content

Commit

Permalink
Rollup merge of rust-lang#100325 - aDotInTheVoid:rdj-import-impl, r=G…
Browse files Browse the repository at this point in the history
…uillaumeGomez

Rustdoc-Json: Don't remove impls for items imported from private modules

After rust-lang#99287, items in private modules may still be in the json output, if a public import accesses them. To reflect this, items that are imported need to be marked as retained in the `Stripper` pass, so their impls arn't removed by `ImplStripper`.

[More context on zulip](https://rust-lang.zulipchat.com/#narrow/stream/266220-rustdoc/topic/Populating.20cache.2Eimpls), thanks to @ jyn514 for helping debug this.

`@rustbot` modify labels: +A-rustdoc-json +T-rustdoc

r? `@GuillaumeGomez`

Fixes rust-lang#100252
Fixes rust-lang#100242
  • Loading branch information
matthiaskrgr authored Aug 15, 2022
2 parents 4c65cf7 + 44b489f commit 969f8af
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
12 changes: 11 additions & 1 deletion src/librustdoc/passes/stripper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,17 @@ impl<'a> DocFolder for Stripper<'a> {
}

// handled in the `strip-priv-imports` pass
clean::ExternCrateItem { .. } | clean::ImportItem(..) => {}
clean::ExternCrateItem { .. } => {}
clean::ImportItem(ref imp) => {
// Because json doesn't inline imports from private modules, we need to mark
// the imported item as retained so it's impls won't be stripped.i
//
// FIXME: Is it necessary to check for json output here: See
// https://github.com/rust-lang/rust/pull/100325#discussion_r941495215
if let Some(did) = imp.source.did && self.is_json_output {
self.retained.insert(did.into());
}
}

clean::ImplItem(..) => {}

Expand Down
24 changes: 24 additions & 0 deletions src/test/rustdoc-json/impls/import_from_private.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// https://github.com/rust-lang/rust/issues/100252

#![feature(no_core)]
#![no_core]

mod bar {
// @set baz = import_from_private.json "$.index[*][?(@.kind=='struct')].id"
pub struct Baz;
// @set impl = - "$.index[*][?(@.kind=='impl')].id"
impl Baz {
// @set doit = - "$.index[*][?(@.kind=='method')].id"
pub fn doit() {}
}
}

// @set import = - "$.index[*][?(@.kind=='import')].id"
pub use bar::Baz;

// FIXME(adotinthevoid): Use hasexact once #99474 lands

// @has - "$.index[*][?(@.kind=='module')].inner.items[*]" $import
// @is - "$.index[*][?(@.kind=='import')].inner.id" $baz
// @has - "$.index[*][?(@.kind=='struct')].inner.impls[*]" $impl
// @has - "$.index[*][?(@.kind=='impl')].inner.items[*]" $doit

0 comments on commit 969f8af

Please sign in to comment.