Skip to content

Commit

Permalink
Rollup merge of rust-lang#43966 - GuillaumeGomez:remove-dup, r=QuietM…
Browse files Browse the repository at this point in the history
…isdreavus

Remove duplicates in rustdoc

Fixes rust-lang#43934.

Two things however:

 1. I'm not happy with the current check. It seems completely overkill and unsatisfying.
 2. I have no idea how to test if there is only one element and not two.

r? @rust-lang/docs
  • Loading branch information
frewsxcv committed Aug 26, 2017
2 parents 1412ff5 + 5d71280 commit e9a6dcc
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/librustdoc/clean/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,10 @@ impl Item {
pub fn is_union(&self) -> bool {
self.type_() == ItemType::Union
}
pub fn is_import(&self) -> bool {
self.type_() == ItemType::Import
}

pub fn is_stripped(&self) -> bool {
match self.inner { StrippedItem(..) => true, _ => false }
}
Expand Down
31 changes: 31 additions & 0 deletions src/librustdoc/html/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1764,6 +1764,37 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context,
}

indices.sort_by(|&i1, &i2| cmp(&items[i1], &items[i2], i1, i2));
// This call is to remove reexport duplicates in cases such as:
//
// ```
// pub mod foo {
// pub mod bar {
// pub trait Double { fn foo(); }
// }
// }
//
// pub use foo::bar::*;
// pub use foo::*;
// ```
//
// `Double` will appear twice in the generated docs.
//
// FIXME: This code is quite ugly and could be improved. Small issue: DefId
// can be identical even if the elements are different (mostly in imports).
// So in case this is an import, we keep everything by adding a "unique id"
// (which is the position in the vector).
indices.dedup_by_key(|i| (items[*i].def_id,
if items[*i].name.as_ref().is_some() {
Some(full_path(cx, &items[*i]).clone())
} else {
None
},
items[*i].type_(),
if items[*i].is_import() {
*i
} else {
0
}));

debug!("{:?}", indices);
let mut curty = None;
Expand Down
24 changes: 24 additions & 0 deletions src/test/rustdoc/remove-duplicates.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![crate_name = "foo"]

mod foo {
pub use bar::*;
pub mod bar {
pub trait Foo {
fn foo();
}
}
}

// @count foo/index.html '//*[@class="trait"]' 1
pub use foo::bar::*;
pub use foo::*;

0 comments on commit e9a6dcc

Please sign in to comment.