Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Show summary lines on cross-crate re-exports #77790

Merged
merged 2 commits into from
Oct 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 5 additions & 26 deletions src/librustdoc/clean/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -393,24 +393,6 @@ pub enum DocFragmentKind {
/// A doc fragment created from a `#[doc(include="filename")]` attribute. Contains both the
/// given filename and the file contents.
Include { filename: String },
/// A doc fragment used to distinguish between documentation in different modules.
///
/// In particular, this prevents `collapse_docs` from turning all documentation comments
/// into a single giant attributes even when the item is re-exported with documentation on the re-export.
Divider,
}

impl DocFragment {
/// Creates a dummy doc-fragment which divides earlier and later fragments.
fn divider() -> Self {
DocFragment {
line: 0,
span: DUMMY_SP,
parent_module: None,
doc: String::new(),
kind: DocFragmentKind::Divider,
}
}
}

impl<'a> FromIterator<&'a DocFragment> for String {
Expand Down Expand Up @@ -551,7 +533,7 @@ impl Attributes {
attrs: &[ast::Attribute],
additional_attrs: Option<(&[ast::Attribute], DefId)>,
) -> Attributes {
let doc_strings = RefCell::new(vec![]);
let mut doc_strings = vec![];
let mut sp = None;
let mut cfg = Cfg::True;
let mut doc_line = 0;
Expand All @@ -568,7 +550,7 @@ impl Attributes {

let line = doc_line;
doc_line += value.lines().count();
doc_strings.borrow_mut().push(DocFragment {
doc_strings.push(DocFragment {
line,
span: attr.span,
doc: value,
Expand All @@ -593,7 +575,7 @@ impl Attributes {
{
let line = doc_line;
doc_line += contents.lines().count();
doc_strings.borrow_mut().push(DocFragment {
doc_strings.push(DocFragment {
line,
span: attr.span,
doc: contents,
Expand All @@ -610,10 +592,7 @@ impl Attributes {
// Additional documentation should be shown before the original documentation
let other_attrs = additional_attrs
.into_iter()
.map(|(attrs, id)| {
doc_strings.borrow_mut().push(DocFragment::divider());
attrs.iter().map(move |attr| (attr, Some(id)))
})
.map(|(attrs, id)| attrs.iter().map(move |attr| (attr, Some(id))))
.flatten()
.chain(attrs.iter().map(|attr| (attr, None)))
.filter_map(clean_attr)
Expand Down Expand Up @@ -642,7 +621,7 @@ impl Attributes {
.map_or(true, |a| a.style == AttrStyle::Inner);

Attributes {
doc_strings: doc_strings.into_inner(),
doc_strings,
other_attrs,
cfg: if cfg == Cfg::True { None } else { Some(Arc::new(cfg)) },
span: sp,
Expand Down
5 changes: 4 additions & 1 deletion src/librustdoc/passes/collapse_docs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ fn collapse(doc_strings: &mut Vec<DocFragment>) {
let curr_kind = &curr_frag.kind;
let new_kind = &frag.kind;

if matches!(*curr_kind, DocFragmentKind::Include { .. }) || curr_kind != new_kind {
if matches!(*curr_kind, DocFragmentKind::Include { .. })
|| curr_kind != new_kind
|| curr_frag.parent_module != frag.parent_module
{
if *curr_kind == DocFragmentKind::SugaredDoc
|| *curr_kind == DocFragmentKind::RawDoc
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#![crate_name = "inner"]

/// Links to [f()]
pub struct Inner;

pub fn f() {}
2 changes: 2 additions & 0 deletions src/test/rustdoc/auxiliary/reexport-check.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/// Docs in original
pub struct S;
9 changes: 7 additions & 2 deletions src/test/rustdoc/intra-link-reexport-additional-docs.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
// aux-build:intra-link-reexport-additional-docs.rs
// build-aux-docs
#![crate_name = "foo"]
extern crate inner;

// @has foo/struct.JoinPathsError.html '//a[@href="../foo/fn.with_code.html"]' 'crate::with_code'
// @has foo/struct.Inner.html '//a[@href="../foo/fn.with_code.html"]' 'crate::with_code'
/// [crate::with_code]
// @has - '//a[@href="../foo/fn.with_code.html"]' 'different text'
/// [different text][with_code]
Expand All @@ -11,7 +14,9 @@
#[doc = "has an attr in the way"]
///
/// [reference link]: me_three
pub use std::env::JoinPathsError;
// Should still resolve links from the original module in that scope
// @has - '//a[@href="../inner/fn.f.html"]' 'f()'
pub use inner::Inner;

pub fn with_code() {}
pub fn me_too() {}
Expand Down
8 changes: 8 additions & 0 deletions src/test/rustdoc/reexport-check.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
// aux-build:reexport-check.rs
#![crate_name = "foo"]

extern crate reexport_check;

// @!has 'foo/index.html' '//code' 'pub use self::i32;'
// @has 'foo/index.html' '//tr[@class="module-item"]' 'i32'
// @has 'foo/i32/index.html'
pub use std::i32;
// @!has 'foo/index.html' '//code' 'pub use self::string::String;'
// @has 'foo/index.html' '//tr[@class="module-item"]' 'String'
pub use std::string::String;

// @has 'foo/index.html' '//td[@class="docblock-short"]' 'Docs in original'
// this is a no-op, but shows what happens if there's an attribute that isn't a doc-comment
#[doc(inline)]
pub use reexport_check::S;