Skip to content

Commit

Permalink
Rollup merge of rust-lang#74147 - dennis-hamester:fix/issue-74134, r=…
Browse files Browse the repository at this point in the history
…jyn514

rustdoc: Allow linking from private items to private types

Fixes rust-lang#74134

After PR rust-lang#72771 this would trigger an intra_doc_link_resolution_failure warning
when rustdoc is invoked without --document-private-items. Links from private
items to private types are however never actually generated in that case and
thus shouldn't produce a warning. These links are in fact a very useful tool to
document crate internals.

Tests are added for all 4 combinations of public/private items and link
targets. Test 1 is the case mentioned above and fails without this commit. Tests
2 - 4 passed before already but are added nonetheless to prevent regressions.
  • Loading branch information
Manishearth committed Jul 13, 2020
2 parents 3502197 + 8789525 commit 6c5fc97
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -799,6 +799,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {

let hir_id = self.cx.tcx.hir().as_local_hir_id(local);
if !self.cx.tcx.privacy_access_levels(LOCAL_CRATE).is_exported(hir_id)
&& (item.visibility == Visibility::Public)
&& !self.cx.render_options.document_private
{
let item_name = item.name.as_deref().unwrap_or("<unknown>");
Expand Down
10 changes: 10 additions & 0 deletions src/test/rustdoc-ui/issue-74134.public.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
warning: `[PrivateType]` public documentation for `public_item` links to a private item
--> $DIR/issue-74134.rs:19:10
|
LL | /// [`PrivateType`]
| ^^^^^^^^^^^^^ this item is private
|
= note: `#[warn(intra_doc_link_resolution_failure)]` on by default

warning: 1 warning emitted

41 changes: 41 additions & 0 deletions src/test/rustdoc-ui/issue-74134.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// revisions: public private
// [private]compile-flags: --document-private-items
// check-pass

// There are 4 cases here:
// 1. public item -> public type: no warning
// 2. public item -> private type: warning, if --document-private-items is not passed
// 3. private item -> public type: no warning
// 4. private item -> private type: no warning
// All 4 cases are tested with and without --document-private-items.
//
// Case 4 without --document-private-items is the one described in issue #74134.

struct PrivateType;
pub struct PublicType;

pub struct Public {
/// [`PublicType`]
/// [`PrivateType`]
//[public]~^ WARNING public documentation for `public_item` links to a private
pub public_item: u32,

/// [`PublicType`]
/// [`PrivateType`]
private_item: u32,
}

// The following cases are identical to the ones above, except that they are in a private
// module. Thus they all fall into cases 3 and 4 and should not produce a warning.

mod private {
pub struct Public {
/// [`super::PublicType`]
/// [`super::PrivateType`]
pub public_item: u32,

/// [`super::PublicType`]
/// [`super::PrivateType`]
private_item: u32,
}
}

0 comments on commit 6c5fc97

Please sign in to comment.