diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs
index fc06dc347b5..2255a2e969f 100644
--- a/src/librustdoc/html/format.rs
+++ b/src/librustdoc/html/format.rs
@@ -540,6 +540,19 @@ impl fmt::Display for clean::Type {
}
}
+impl fmt::Display for clean::Impl {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ try!(write!(f, "impl{} ", self.generics));
+ if let Some(ref ty) = self.trait_ {
+ try!(write!(f, "{}{} for ",
+ if self.polarity == Some(clean::ImplPolarity::Negative) { "!" } else { "" },
+ *ty));
+ }
+ try!(write!(f, "{}{}", self.for_, WhereClause(&self.generics)));
+ Ok(())
+ }
+}
+
impl fmt::Display for clean::Arguments {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for (i, input) in self.values.iter().enumerate() {
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 07e3ae975d6..57c0db8f96e 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -118,11 +118,8 @@ pub enum ExternalLocation {
/// Metadata about an implementor of a trait.
pub struct Implementor {
pub def_id: ast::DefId,
- pub generics: clean::Generics,
- pub trait_: clean::Type,
- pub for_: clean::Type,
pub stability: Option,
- pub polarity: Option,
+ pub impl_: clean::Impl,
}
/// Metadata about implementations for a type.
@@ -644,10 +641,7 @@ fn write_shared(cx: &Context,
// going on). If they're in different crates then the crate defining
// the trait will be interested in our implementation.
if imp.def_id.krate == did.krate { continue }
- try!(write!(&mut f, r#""impl{} {}{} for {}","#,
- imp.generics,
- if imp.polarity == Some(clean::ImplPolarity::Negative) { "!" } else { "" },
- imp.trait_, imp.for_));
+ try!(write!(&mut f, r#""{}","#, imp.impl_));
}
try!(writeln!(&mut f, r"];"));
try!(writeln!(&mut f, "{}", r"
@@ -888,11 +882,8 @@ impl DocFolder for Cache {
Some(clean::ResolvedPath{ did, .. }) => {
self.implementors.entry(did).or_insert(vec![]).push(Implementor {
def_id: item.def_id,
- generics: i.generics.clone(),
- trait_: i.trait_.as_ref().unwrap().clone(),
- for_: i.for_.clone(),
stability: item.stability.clone(),
- polarity: i.polarity.clone(),
+ impl_: i.clone(),
});
}
Some(..) | None => {}
@@ -1910,8 +1901,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
match cache.implementors.get(&it.def_id) {
Some(implementors) => {
for i in implementors {
- try!(writeln!(w, "impl{} {} for {}{}
",
- i.generics, i.trait_, i.for_, WhereClause(&i.generics)));
+ try!(writeln!(w, "{}
", i.impl_));
}
}
None => {}
@@ -2335,16 +2325,7 @@ fn render_deref_methods(w: &mut fmt::Formatter, impl_: &Impl) -> fmt::Result {
fn render_impl(w: &mut fmt::Formatter, i: &Impl, link: AssocItemLink,
render_header: bool) -> fmt::Result {
if render_header {
- try!(write!(w, "impl{} ",
- i.impl_.generics));
- if let Some(clean::ImplPolarity::Negative) = i.impl_.polarity {
- try!(write!(w, "!"));
- }
- if let Some(ref ty) = i.impl_.trait_ {
- try!(write!(w, "{} for ", *ty));
- }
- try!(write!(w, "{}{}
", i.impl_.for_,
- WhereClause(&i.impl_.generics)));
+ try!(write!(w, "{}
", i.impl_));
if let Some(ref dox) = i.dox {
try!(write!(w, "{}
", Markdown(dox)));
}
diff --git a/src/test/auxiliary/rustdoc-impl-parts-crosscrate.rs b/src/test/auxiliary/rustdoc-impl-parts-crosscrate.rs
new file mode 100644
index 00000000000..6e8f80c8f5f
--- /dev/null
+++ b/src/test/auxiliary/rustdoc-impl-parts-crosscrate.rs
@@ -0,0 +1,15 @@
+// Copyright 2015 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 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(optin_builtin_traits)]
+
+pub trait AnOibit {}
+
+impl AnOibit for .. {}
diff --git a/src/test/rustdoc/impl-parts-crosscrate.rs b/src/test/rustdoc/impl-parts-crosscrate.rs
new file mode 100644
index 00000000000..5fa2e03e0a8
--- /dev/null
+++ b/src/test/rustdoc/impl-parts-crosscrate.rs
@@ -0,0 +1,30 @@
+// Copyright 2015 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 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:rustdoc-impl-parts-crosscrate.rs
+// ignore-cross-compile
+
+#![feature(optin_builtin_traits)]
+
+extern crate rustdoc_impl_parts_crosscrate;
+
+pub struct Bar { t: T }
+
+// The output file is html embeded in javascript, so the html tags
+// aren't stripped by the processing script and we can't check for the
+// full impl string. Instead, just make sure something from each part
+// is mentioned.
+
+// @has implementors/rustdoc_impl_parts_crosscrate/trait.AnOibit.js Bar
+// @has - Send
+// @has - !AnOibit
+// @has - Copy
+impl !rustdoc_impl_parts_crosscrate::AnOibit for Bar
+ where T: Copy {}
diff --git a/src/test/rustdoc/impl-parts.rs b/src/test/rustdoc/impl-parts.rs
new file mode 100644
index 00000000000..89c5e60e343
--- /dev/null
+++ b/src/test/rustdoc/impl-parts.rs
@@ -0,0 +1,23 @@
+// Copyright 2015 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 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(optin_builtin_traits)]
+
+pub trait AnOibit {}
+
+impl AnOibit for .. {}
+
+pub struct Foo { field: T }
+
+// @has impl_parts/struct.Foo.html '//*[@class="impl"]//code' \
+// "impl !AnOibit for Foo where T: Sync"
+// @has impl_parts/trait.AnOibit.html '//*[@class="item-list"]//code' \
+// "impl !AnOibit for Foo where T: Sync"
+impl !AnOibit for Foo where T: Sync {}