Skip to content

Commit 093e18d

Browse files
author
Ulrik Sverdrup
committed
rustdoc: Skip types in impls in search index
For a trait *implementation* there are typedefs which are the types for that particular trait and implementor. Skip these in the search index. There were lots of dud items in the search index due to this (search for Item, Iterator's associated type). Add a boolean to clean::TypedefItem so that it tracks whether the it is a type alias on its own, or if it's a `type` item in a trait impl. Fixes rust-lang#22442
1 parent d7185dc commit 093e18d

File tree

4 files changed

+25
-11
lines changed

4 files changed

+25
-11
lines changed

src/librustdoc/clean/inline.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ fn build_type(cx: &DocContext, tcx: &ty::ctxt, did: ast::DefId) -> clean::ItemEn
216216
clean::TypedefItem(clean::Typedef {
217217
type_: t.ty.clean(cx),
218218
generics: (&t.generics, &predicates, subst::TypeSpace).clean(cx),
219-
})
219+
}, false)
220220
}
221221

222222
pub fn build_impls(cx: &DocContext, tcx: &ty::ctxt,
@@ -368,7 +368,7 @@ pub fn build_impl(cx: &DocContext,
368368
subst::ParamSpace::TypeSpace).clean(cx);
369369
Some(clean::Item {
370370
name: Some(assoc_ty.name.clean(cx)),
371-
inner: clean::TypedefItem(typedef),
371+
inner: clean::TypedefItem(typedef, true),
372372
source: clean::Span::empty(),
373373
attrs: vec![],
374374
visibility: None,

src/librustdoc/clean/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ pub enum ItemEnum {
343343
EnumItem(Enum),
344344
FunctionItem(Function),
345345
ModuleItem(Module),
346-
TypedefItem(Typedef),
346+
TypedefItem(Typedef, bool /* is associated type */),
347347
StaticItem(Static),
348348
ConstantItem(Constant),
349349
TraitItem(Trait),
@@ -1282,7 +1282,7 @@ impl Clean<Item> for ast::ImplItem {
12821282
type_params: Vec::new(),
12831283
where_predicates: Vec::new()
12841284
},
1285-
}),
1285+
}, true),
12861286
ast::MacImplItem(_) => {
12871287
MacroItem(Macro {
12881288
source: self.span.to_src(cx),
@@ -2078,7 +2078,7 @@ impl Clean<Item> for doctree::Typedef {
20782078
inner: TypedefItem(Typedef {
20792079
type_: self.ty.clean(cx),
20802080
generics: self.gen.clean(cx),
2081-
}),
2081+
}, false),
20822082
}
20832083
}
20842084
}
@@ -2248,7 +2248,7 @@ fn build_deref_target_impls(cx: &DocContext,
22482248

22492249
for item in items {
22502250
let target = match item.inner {
2251-
TypedefItem(ref t) => &t.type_,
2251+
TypedefItem(ref t, true) => &t.type_,
22522252
_ => continue,
22532253
};
22542254
let primitive = match *target {

src/librustdoc/html/render.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -870,7 +870,7 @@ impl DocFolder for Cache {
870870
clean::StructItem(ref s) => self.generics(&s.generics),
871871
clean::EnumItem(ref e) => self.generics(&e.generics),
872872
clean::FunctionItem(ref f) => self.generics(&f.generics),
873-
clean::TypedefItem(ref t) => self.generics(&t.generics),
873+
clean::TypedefItem(ref t, _) => self.generics(&t.generics),
874874
clean::TraitItem(ref t) => self.generics(&t.generics),
875875
clean::ImplItem(ref i) => self.generics(&i.generics),
876876
clean::TyMethodItem(ref i) => self.generics(&i.generics),
@@ -936,6 +936,10 @@ impl DocFolder for Cache {
936936
((Some(*last), path), true)
937937
}
938938
}
939+
clean::TypedefItem(_, true) => {
940+
// skip associated types in impls
941+
((None, None), false)
942+
}
939943
_ => ((None, Some(&*self.stack)), false)
940944
};
941945
let hidden_field = match item.inner {
@@ -1497,7 +1501,7 @@ impl<'a> fmt::Display for Item<'a> {
14971501
clean::TraitItem(ref t) => item_trait(fmt, self.cx, self.item, t),
14981502
clean::StructItem(ref s) => item_struct(fmt, self.item, s),
14991503
clean::EnumItem(ref e) => item_enum(fmt, self.item, e),
1500-
clean::TypedefItem(ref t) => item_typedef(fmt, self.item, t),
1504+
clean::TypedefItem(ref t, _) => item_typedef(fmt, self.item, t),
15011505
clean::MacroItem(ref m) => item_macro(fmt, self.item, m),
15021506
clean::PrimitiveItem(ref p) => item_primitive(fmt, self.item, p),
15031507
clean::StaticItem(ref i) | clean::ForeignStaticItem(ref i) =>
@@ -2303,10 +2307,10 @@ fn render_deref_methods(w: &mut fmt::Formatter, impl_: &Impl) -> fmt::Result {
23032307
let deref_type = impl_.impl_.trait_.as_ref().unwrap();
23042308
let target = impl_.impl_.items.iter().filter_map(|item| {
23052309
match item.inner {
2306-
clean::TypedefItem(ref t) => Some(&t.type_),
2310+
clean::TypedefItem(ref t, true) => Some(&t.type_),
23072311
_ => None,
23082312
}
2309-
}).next().unwrap();
2313+
}).next().expect("Expected associated type binding");
23102314
let what = AssocItemRender::DerefFor { trait_: deref_type, type_: target };
23112315
match *target {
23122316
clean::ResolvedPath { did, .. } => render_assoc_items(w, did, what),
@@ -2350,7 +2354,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl, link: AssocItemLink,
23502354
try!(render_assoc_item(w, item, link));
23512355
try!(write!(w, "</code></h4>\n"));
23522356
}
2353-
clean::TypedefItem(ref tydef) => {
2357+
clean::TypedefItem(ref tydef, _) => {
23542358
let name = item.name.as_ref().unwrap();
23552359
try!(write!(w, "<h4 id='assoc_type.{}' class='{}'><code>",
23562360
*name,

src/test/rustdoc/search-index.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
#![crate_name = "rustdoc_test"]
1212

13+
use std::ops::Deref;
14+
1315
// @has search-index.js Foo
1416
pub use private::Foo;
1517

@@ -24,3 +26,11 @@ mod private {
2426
fn trait_method(&self) {} // @!has - priv_method
2527
}
2628
}
29+
30+
pub struct Bar;
31+
32+
impl Deref for Bar {
33+
// @!has search-index.js Target
34+
type Target = Bar;
35+
fn deref(&self) -> &Bar { self }
36+
}

0 commit comments

Comments
 (0)