From 8e77c5a79a7053e0e9ff7b6233c1b7a68c420611 Mon Sep 17 00:00:00 2001 From: Carter Hinsley Date: Mon, 12 Jan 2015 00:57:35 -0500 Subject: [PATCH 1/3] make rendered method anchor IDs and links unique add unique contexts to rendered method anchor IDs and links --- src/librustdoc/html/render.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index ddb14d6944b9d..37b1ac5950b08 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1818,16 +1818,17 @@ fn assoc_type(w: &mut fmt::Formatter, it: &clean::Item, Ok(()) } -fn render_method(w: &mut fmt::Formatter, meth: &clean::Item) -> fmt::Result { - fn method(w: &mut fmt::Formatter, it: &clean::Item, unsafety: ast::Unsafety, - g: &clean::Generics, selfty: &clean::SelfTy, +fn render_method(w: &mut fmt::Formatter, meth: &clean::Item, ctx_s: &str) -> fmt::Result { + fn method(w: &mut fmt::Formatter, it: &clean::Item, ctx_s: &str, + unsafety: ast::Unsafety, g: &clean::Generics, selfty: &clean::SelfTy, d: &clean::FnDecl) -> fmt::Result { - write!(w, "{}fn {name}\ + write!(w, "{}fn {name}\ {generics}{decl}{where_clause}", match unsafety { ast::Unsafety::Unsafe => "unsafe ", _ => "", }, + ctx = ctx_s, ty = shortty(it), name = it.name.as_ref().unwrap().as_slice(), generics = *g, @@ -1836,13 +1837,13 @@ fn render_method(w: &mut fmt::Formatter, meth: &clean::Item) -> fmt::Result { } match meth.inner { clean::TyMethodItem(ref m) => { - method(w, meth, m.unsafety, &m.generics, &m.self_, &m.decl) + method(w, meth, ctx_s, m.unsafety, &m.generics, &m.self_, &m.decl) } clean::MethodItem(ref m) => { - method(w, meth, m.unsafety, &m.generics, &m.self_, &m.decl) + method(w, meth, ctx_s, m.unsafety, &m.generics, &m.self_, &m.decl) } clean::AssociatedTypeItem(ref typ) => { - assoc_type(w, meth, typ) + assoc_type(w, meth, ctx_s, typ) } _ => panic!("render_method called on non-method") } @@ -2082,11 +2083,14 @@ fn render_methods(w: &mut fmt::Formatter, it: &clean::Item) -> fmt::Result { } fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { + let method_context: &str = ""; + try!(write!(w, "

{}impl{} ", ConciseStability(&i.stability), i.impl_.generics)); match i.impl_.trait_ { - Some(ref ty) => try!(write!(w, "{} for ", *ty)), + Some(ref ty) => {method_context = format!("{}", *ty).as_slice(); + try!(write!(w, "{} for ", *ty))}, None => {} } try!(write!(w, "{}{}

", i.impl_.for_, WhereClause(&i.impl_.generics))); @@ -2102,11 +2106,12 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { -> fmt::Result { match item.inner { clean::MethodItem(..) | clean::TyMethodItem(..) => { - try!(write!(w, "

{}", + try!(write!(w, "

{}", + method_context, *item.name.as_ref().unwrap(), shortty(item), ConciseStability(&item.stability))); - try!(render_method(w, item)); + try!(render_method(w, item, method_context)); try!(write!(w, "

\n")); } clean::TypedefItem(ref tydef) => { From a801a426ee7399be4bbfbf897b67ad5de1a6609f Mon Sep 17 00:00:00 2001 From: Carter Hinsley Date: Mon, 12 Jan 2015 11:05:04 -0500 Subject: [PATCH 2/3] fix mutability of method_context variable --- src/librustdoc/html/render.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 37b1ac5950b08..38d4deee76522 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -2083,7 +2083,7 @@ fn render_methods(w: &mut fmt::Formatter, it: &clean::Item) -> fmt::Result { } fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { - let method_context: &str = ""; + let mut method_context: &str = ""; try!(write!(w, "

{}impl{} ", ConciseStability(&i.stability), @@ -2093,6 +2093,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { try!(write!(w, "{} for ", *ty))}, None => {} } + method_context = format!("{}:{}", i.impl_.for_, method_context).as_slice(); try!(write!(w, "{}{}

", i.impl_.for_, WhereClause(&i.impl_.generics))); match i.dox { Some(ref dox) => { From 207cf11a4ea2dad5cbb57ee54146360e896f9485 Mon Sep 17 00:00:00 2001 From: Carter Hinsley Date: Thu, 5 Feb 2015 11:09:51 +0000 Subject: [PATCH 3/3] Resolve errors with rustdoc issue #20700 fix --- src/librustdoc/html/render.rs | 55 +++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 38d4deee76522..b4db409f40671 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1704,7 +1704,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, try!(write!(w, "{{\n")); for t in types.iter() { try!(write!(w, " ")); - try!(render_method(w, t.item())); + try!(render_method(w, t.item(), cx.current.connect(",").as_slice())); try!(write!(w, ";\n")); } if types.len() > 0 && required.len() > 0 { @@ -1712,7 +1712,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, } for m in required.iter() { try!(write!(w, " ")); - try!(render_method(w, m.item())); + try!(render_method(w, m.item(), cx.current.connect(",").as_slice())); try!(write!(w, ";\n")); } if required.len() > 0 && provided.len() > 0 { @@ -1720,7 +1720,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, } for m in provided.iter() { try!(write!(w, " ")); - try!(render_method(w, m.item())); + try!(render_method(w, m.item(), cx.current.connect(",").as_slice())); try!(write!(w, " {{ ... }}\n")); } try!(write!(w, "}}")); @@ -1732,11 +1732,16 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, fn trait_item(w: &mut fmt::Formatter, m: &clean::TraitMethod) -> fmt::Result { + let ctx_s: &str = match m.item().name { + Some(ref name) => name.as_slice(), + None => "" + }; + try!(write!(w, "

{}", shortty(m.item()), *m.item().name.as_ref().unwrap(), ConciseStability(&m.item().stability))); - try!(render_method(w, m.item())); + try!(render_method(w, m.item(), ctx_s)); try!(write!(w, "

")); try!(document(w, m.item())); Ok(()) @@ -1806,7 +1811,8 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, Ok(()) } -fn assoc_type(w: &mut fmt::Formatter, it: &clean::Item, +fn assoc_type(w: &mut fmt::Formatter, + it: &clean::Item, typ: &clean::TyParam) -> fmt::Result { try!(write!(w, "type {}", it.name.as_ref().unwrap())); if typ.bounds.len() > 0 { @@ -1843,7 +1849,7 @@ fn render_method(w: &mut fmt::Formatter, meth: &clean::Item, ctx_s: &str) -> fmt method(w, meth, ctx_s, m.unsafety, &m.generics, &m.self_, &m.decl) } clean::AssociatedTypeItem(ref typ) => { - assoc_type(w, meth, ctx_s, typ) + assoc_type(w, meth, typ) } _ => panic!("render_method called on non-method") } @@ -2083,17 +2089,16 @@ fn render_methods(w: &mut fmt::Formatter, it: &clean::Item) -> fmt::Result { } fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { - let mut method_context: &str = ""; - try!(write!(w, "

{}impl{} ", ConciseStability(&i.stability), i.impl_.generics)); - match i.impl_.trait_ { - Some(ref ty) => {method_context = format!("{}", *ty).as_slice(); - try!(write!(w, "{} for ", *ty))}, - None => {} - } - method_context = format!("{}:{}", i.impl_.for_, method_context).as_slice(); + let method_context = format!("{}:{}", + i.impl_.for_, + match i.impl_.trait_ { + Some(ref ty) => {try!(write!(w, "{} for ", *ty)); + format!("{}", *ty)}, + None => String::from_str("") + }); try!(write!(w, "{}{}

", i.impl_.for_, WhereClause(&i.impl_.generics))); match i.dox { Some(ref dox) => { @@ -2103,8 +2108,10 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { None => {} } - fn doctraititem(w: &mut fmt::Formatter, item: &clean::Item, dox: bool) - -> fmt::Result { + fn doctraititem(w: &mut fmt::Formatter, + item: &clean::Item, + dox: bool, + method_context: &str) -> fmt::Result { match item.inner { clean::MethodItem(..) | clean::TyMethodItem(..) => { try!(write!(w, "

{}", @@ -2146,12 +2153,13 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { try!(write!(w, "
")); for trait_item in i.impl_.items.iter() { - try!(doctraititem(w, trait_item, true)); + try!(doctraititem(w, trait_item, true, method_context.as_slice())); } - fn render_default_methods(w: &mut fmt::Formatter, - t: &clean::Trait, - i: &clean::Impl) -> fmt::Result { + fn render_default_methods(w: &mut fmt::Formatter, + t: &clean::Trait, + i: &clean::Impl, + method_context: &str) -> fmt::Result { for trait_item in t.items.iter() { let n = trait_item.item().name.clone(); match i.items.iter().find(|m| { m.name == n }) { @@ -2159,7 +2167,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { None => {} } - try!(doctraititem(w, trait_item.item(), false)); + try!(doctraititem(w, trait_item.item(), false, method_context.as_slice())); } Ok(()) } @@ -2172,7 +2180,10 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result { Some(clean::ResolvedPath { did, .. }) => { try!({ match cache().traits.get(&did) { - Some(t) => try!(render_default_methods(w, t, &i.impl_)), + Some(t) => try!(render_default_methods(w, + t, + &i.impl_, + method_context.as_slice())), None => {} } Ok(())