From a0734ff7e03b57db46cf8549c8329cddce4934ec Mon Sep 17 00:00:00 2001 From: Tom Jakubowski Date: Wed, 7 Jan 2015 16:10:40 -0800 Subject: [PATCH] rustdoc: Render associated type bindings e.g. `Foo` This does not work cross-crate unfortunately. Part of #20646 --- src/librustdoc/clean/mod.rs | 25 +++++++++++++++++++++++-- src/librustdoc/html/format.rs | 27 +++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index bf2664bba6ad3..ea6bfc64c2227 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -530,7 +530,8 @@ fn external_path_params(cx: &DocContext, trait_did: Option, _ => { return PathParameters::AngleBracketed { lifetimes: lifetimes, - types: types.clean(cx) + types: types.clean(cx), + bindings: vec![] } } }; @@ -547,6 +548,7 @@ fn external_path_params(cx: &DocContext, trait_did: Option, PathParameters::AngleBracketed { lifetimes: lifetimes, types: types.clean(cx), + bindings: vec![] // FIXME(#20646) } } } @@ -1766,6 +1768,7 @@ pub enum PathParameters { AngleBracketed { lifetimes: Vec, types: Vec, + bindings: Vec }, Parenthesized { inputs: Vec, @@ -1779,7 +1782,8 @@ impl Clean for ast::PathParameters { ast::AngleBracketedParameters(ref data) => { PathParameters::AngleBracketed { lifetimes: data.lifetimes.clean(cx), - types: data.types.clean(cx) + types: data.types.clean(cx), + bindings: data.bindings.clean(cx) } } @@ -2442,8 +2446,25 @@ fn lang_struct(cx: &DocContext, did: Option, params: PathParameters::AngleBracketed { lifetimes: vec![], types: vec![t.clean(cx)], + bindings: vec![] } }], }, } } + +/// An equality constraint on an associated type, e.g. `A=Bar` in `Foo` +#[derive(Clone, PartialEq, RustcDecodable, RustcEncodable)] +pub struct TypeBinding { + pub name: String, + pub ty: Type +} + +impl Clean for ast::TypeBinding { + fn clean(&self, cx: &DocContext) -> TypeBinding { + TypeBinding { + name: self.ident.clean(cx), + ty: self.ty.clean(cx) + } + } +} diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index b24e7a7a4cf81..0757441ed878d 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -250,8 +250,10 @@ impl fmt::Show for clean::PathParameters { impl fmt::String for clean::PathParameters { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { - clean::PathParameters::AngleBracketed { ref lifetimes, ref types } => { - if lifetimes.len() > 0 || types.len() > 0 { + clean::PathParameters::AngleBracketed { + ref lifetimes, ref types, ref bindings + } => { + if lifetimes.len() > 0 || types.len() > 0 || bindings.len() > 0 { try!(f.write_str("<")); let mut comma = false; for lifetime in lifetimes.iter() { @@ -268,6 +270,13 @@ impl fmt::String for clean::PathParameters { comma = true; try!(write!(f, "{}", *ty)); } + for binding in bindings.iter() { + if comma { + try!(f.write_str(", ")); + } + comma = true; + try!(write!(f, "{}", *binding)); + } try!(f.write_str(">")); } } @@ -855,6 +864,7 @@ impl fmt::String for clean::ViewListIdent { params: clean::PathParameters::AngleBracketed { lifetimes: Vec::new(), types: Vec::new(), + bindings: Vec::new() } }) }; @@ -865,6 +875,19 @@ impl fmt::String for clean::ViewListIdent { } } +//NOTE(stage0): remove impl after snapshot +impl fmt::Show for clean::TypeBinding { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::String::fmt(self, f) + } +} + +impl fmt::String for clean::TypeBinding { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}={}", self.name, self.ty) + } +} + //NOTE(stage0): remove impl after snapshot #[cfg(stage0)] impl fmt::Show for MutableSpace {