From 456770472b07a8fe2e3d02bfc12b619d48935df2 Mon Sep 17 00:00:00 2001 From: William Throwe Date: Sat, 18 Jul 2015 02:02:57 -0400 Subject: [PATCH] Fix rustdoc formatting of impls Some cases displayed negative impls as positive, and some were missing where clauses. This factors all the impl formatting into one function so the different cases can't get out of sync again. --- src/librustdoc/html/format.rs | 13 +++++++++++++ src/librustdoc/html/render.rs | 29 +++++------------------------ 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index fc06dc347b5e..2255a2e969f1 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 07e3ae975d66..57c0db8f96e6 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))); }