diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2021-05-03 00:32:45 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-03 00:32:45 +0200 |
| commit | 83c49d09b776038d97b8a45c7269bd686b16ec9a (patch) | |
| tree | 355c50153da83f2ae8df9c8a98e2f6b4a4d58d82 | |
| parent | b0c7e64de0d2a7dfb172949c4d1cb01ee144025b (diff) | |
| parent | 9ca6d5863be4ca847458a8b42e995b98406ad015 (diff) | |
| download | rust-83c49d09b776038d97b8a45c7269bd686b16ec9a.tar.gz rust-83c49d09b776038d97b8a45c7269bd686b16ec9a.zip | |
Rollup merge of #84832 - Stupremee:dont-print-vis-in-external-traits, r=jyn514
Do not print visibility in external traits This PR fixes the bug that caused traits, which were re-exported, having visibility modifiers in front of methods, which is invalid. It would be nice to add a test for this, but I don't even know if tests with multiple crates are possible. Resolves #81274
| -rw-r--r-- | src/librustdoc/clean/inline.rs | 16 | ||||
| -rw-r--r-- | src/test/rustdoc/auxiliary/trait-visibility.rs | 3 | ||||
| -rw-r--r-- | src/test/rustdoc/trait-visibility.rs | 8 |
3 files changed, 24 insertions, 3 deletions
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index f6c13e5f418..6ad635012b1 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -19,7 +19,7 @@ use crate::clean::{self, Attributes, AttributesExt, GetDefId, ToSource}; use crate::core::DocContext; use crate::formats::item_type::ItemType; -use super::Clean; +use super::{Clean, Visibility}; type Attrs<'hir> = rustc_middle::ty::Attributes<'hir>; @@ -193,8 +193,18 @@ crate fn record_extern_fqn(cx: &mut DocContext<'_>, did: DefId, kind: ItemType) } crate fn build_external_trait(cx: &mut DocContext<'_>, did: DefId) -> clean::Trait { - let trait_items = - cx.tcx.associated_items(did).in_definition_order().map(|item| item.clean(cx)).collect(); + let trait_items = cx + .tcx + .associated_items(did) + .in_definition_order() + .map(|item| { + // When building an external trait, the cleaned trait will have all items public, + // which causes methods to have a `pub` prefix, which is invalid since items in traits + // can not have a visibility prefix. Thus we override the visibility here manually. + // See https://github.com/rust-lang/rust/issues/81274 + clean::Item { visibility: Visibility::Inherited, ..item.clean(cx) } + }) + .collect(); let predicates = cx.tcx.predicates_of(did); let generics = (cx.tcx.generics_of(did), predicates).clean(cx); diff --git a/src/test/rustdoc/auxiliary/trait-visibility.rs b/src/test/rustdoc/auxiliary/trait-visibility.rs new file mode 100644 index 00000000000..1e8d0b8e02a --- /dev/null +++ b/src/test/rustdoc/auxiliary/trait-visibility.rs @@ -0,0 +1,3 @@ +pub trait Bar { + fn foo(); +} diff --git a/src/test/rustdoc/trait-visibility.rs b/src/test/rustdoc/trait-visibility.rs new file mode 100644 index 00000000000..8ba3ee03a74 --- /dev/null +++ b/src/test/rustdoc/trait-visibility.rs @@ -0,0 +1,8 @@ +// aux-build:trait-visibility.rs + +#![crate_name = "foo"] + +extern crate trait_visibility; + +// @has foo/trait.Bar.html '//a[@href="#tymethod.foo"]/..' "fn foo()" +pub use trait_visibility::Bar; |
