Skip to content

Commit

Permalink
rustdoc: Render associated type bindings
Browse files Browse the repository at this point in the history
e.g. `Foo<Output=A>`

This does not work cross-crate unfortunately.

Part of #20646
  • Loading branch information
tomjakubowski committed Jan 8, 2015
1 parent 9f1ead8 commit a0734ff
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 4 deletions.
25 changes: 23 additions & 2 deletions src/librustdoc/clean/mod.rs
Expand Up @@ -530,7 +530,8 @@ fn external_path_params(cx: &DocContext, trait_did: Option<ast::DefId>,
_ => {
return PathParameters::AngleBracketed {
lifetimes: lifetimes,
types: types.clean(cx)
types: types.clean(cx),
bindings: vec![]
}
}
};
Expand All @@ -547,6 +548,7 @@ fn external_path_params(cx: &DocContext, trait_did: Option<ast::DefId>,
PathParameters::AngleBracketed {
lifetimes: lifetimes,
types: types.clean(cx),
bindings: vec![] // FIXME(#20646)
}
}
}
Expand Down Expand Up @@ -1766,6 +1768,7 @@ pub enum PathParameters {
AngleBracketed {
lifetimes: Vec<Lifetime>,
types: Vec<Type>,
bindings: Vec<TypeBinding>
},
Parenthesized {
inputs: Vec<Type>,
Expand All @@ -1779,7 +1782,8 @@ impl Clean<PathParameters> 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)
}
}

Expand Down Expand Up @@ -2442,8 +2446,25 @@ fn lang_struct(cx: &DocContext, did: Option<ast::DefId>,
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<A=Bar>`
#[derive(Clone, PartialEq, RustcDecodable, RustcEncodable)]
pub struct TypeBinding {
pub name: String,
pub ty: Type
}

impl Clean<TypeBinding> for ast::TypeBinding {
fn clean(&self, cx: &DocContext) -> TypeBinding {
TypeBinding {
name: self.ident.clean(cx),
ty: self.ty.clean(cx)
}
}
}
27 changes: 25 additions & 2 deletions src/librustdoc/html/format.rs
Expand Up @@ -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("&lt;"));
let mut comma = false;
for lifetime in lifetimes.iter() {
Expand All @@ -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("&gt;"));
}
}
Expand Down Expand Up @@ -855,6 +864,7 @@ impl fmt::String for clean::ViewListIdent {
params: clean::PathParameters::AngleBracketed {
lifetimes: Vec::new(),
types: Vec::new(),
bindings: Vec::new()
}
})
};
Expand All @@ -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 {
Expand Down

0 comments on commit a0734ff

Please sign in to comment.