diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index 9496b7e2a6f..eccdd08db8a 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -35,7 +35,7 @@ use std::fmt; use std::slice; use std::str; -use html::render::{with_unique_id, reset_ids}; +use html::render::with_unique_id; use html::toc::TocBuilder; use html::highlight; use html::escape::Escape; @@ -322,8 +322,6 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result { unsafe { hoedown_buffer_puts(ob, text.as_ptr()) } } - reset_ids(); - extern fn codespan( ob: *mut hoedown_buffer, text: *const hoedown_buffer, @@ -554,6 +552,7 @@ pub fn plain_summary_line(md: &str) -> String { mod tests { use super::{LangString, Markdown}; use super::plain_summary_line; + use html::render::reset_ids; #[test] fn test_lang_string_parse() { @@ -593,6 +592,7 @@ mod tests { fn t(input: &str, expect: &str) { let output = format!("{}", Markdown(input)); assert_eq!(output, expect); + reset_ids(); } t("# Foo bar", "\n

\ diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index c4fb9d5d9e7..e7fe4de8d04 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1725,10 +1725,10 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context, ItemType::AssociatedType => ("associated-types", "Associated Types"), ItemType::AssociatedConst => ("associated-consts", "Associated Constants"), }; - try!(write!(w, - "

\ - {name}

\n", - id = short, name = name)); + try!(with_unique_id(short.to_owned(), |id| + write!(w, "

\ + {name}

\n
", + id = id, name = name))); } match myitem.inner { @@ -1949,10 +1949,11 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, fn trait_item(w: &mut fmt::Formatter, cx: &Context, m: &clean::Item) -> fmt::Result { - try!(write!(w, "

", - ty = shortty(m), - name = *m.name.as_ref().unwrap(), - stab = m.stability_class())); + let name = m.name.as_ref().unwrap(); + try!(with_unique_id(format!("{}.{}", shortty(m), name), |id| + write!(w, "

", + id = id, + stab = m.stability_class()))); try!(render_assoc_item(w, m, AssocItemLink::Anchor)); try!(write!(w, "

")); try!(document(w, cx, m)); @@ -2141,11 +2142,12 @@ fn item_struct(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, if fields.peek().is_some() { try!(write!(w, "

Fields

\n

")); for field in fields { - try!(write!(w, " - ")); } @@ -2212,8 +2214,9 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, if !e.variants.is_empty() { try!(write!(w, "

Variants

\n
\ - {name}", - stab = field.stability_class(), - name = field.name.as_ref().unwrap())); + let name = field.name.as_ref().unwrap(); + try!(with_unique_id(format!("structfield.{}", name), |id| + write!(w, "
{}", + field.stability_class(), + id, + name))); try!(document(w, cx, field)); try!(write!(w, "
")); for variant in &e.variants { - try!(write!(w, "
{name}", - name = variant.name.as_ref().unwrap())); + let name = variant.name.as_ref().unwrap(); + try!(with_unique_id(format!("variant.{}", name), |id| + write!(w, "
{}", id, name))); try!(document(w, cx, variant)); match variant.inner { clean::VariantItem(ref var) => { @@ -2231,11 +2234,10 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, try!(write!(w, "

Fields

\n ")); for field in fields { - try!(write!(w, "")); } @@ -2447,44 +2449,38 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi fn doctraititem(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item, link: AssocItemLink, render_static: bool) -> fmt::Result { + let name = item.name.as_ref().unwrap(); match item.inner { clean::MethodItem(..) | clean::TyMethodItem(..) => { // Only render when the method is not static or we allow static methods if !is_static_method(item) || render_static { - try!(write!(w, "

", - *item.name.as_ref().unwrap(), - shortty(item))); + try!(with_unique_id(format!("method.{}", name), |id| + write!(w, "

", id, shortty(item)))); try!(render_assoc_item(w, item, link)); try!(write!(w, "

\n")); } } clean::TypedefItem(ref tydef, _) => { - let name = item.name.as_ref().unwrap(); - try!(write!(w, "

", - *name, - shortty(item))); + try!(with_unique_id(format!("assoc_type.{}", name), |id| + write!(w, "

", id, shortty(item)))); try!(write!(w, "type {} = {}", name, tydef.type_)); try!(write!(w, "

\n")); } clean::AssociatedConstItem(ref ty, ref default) => { - let name = item.name.as_ref().unwrap(); - try!(write!(w, "

", - *name, shortty(item))); + try!(with_unique_id(format!("assoc_const.{}", name), |id| + write!(w, "

", id, shortty(item)))); try!(assoc_const(w, item, ty, default.as_ref())); try!(write!(w, "

\n")); } clean::ConstantItem(ref c) => { - let name = item.name.as_ref().unwrap(); - try!(write!(w, "

", - *name, shortty(item))); + try!(with_unique_id(format!("assoc_const.{}", name), |id| + write!(w, "

", id, shortty(item)))); try!(assoc_const(w, item, &c.type_, Some(&c.expr))); try!(write!(w, "

\n")); } clean::AssociatedTypeItem(ref bounds, ref default) => { - let name = item.name.as_ref().unwrap(); - try!(write!(w, "

", - *name, - shortty(item))); + try!(with_unique_id(format!("assoc_type.{}", name), |id| + write!(w, "

", id, shortty(item)))); try!(assoc_type(w, item, bounds, default)); try!(write!(w, "

\n")); }

\ - {f}", - v = variant.name.as_ref().unwrap(), - f = field.name.as_ref().unwrap())); + let v = variant.name.as_ref().unwrap(); + let f = field.name.as_ref().unwrap(); + try!(with_unique_id(format!("variant.{}.field.{}", v, f), |id| + write!(w, "
{}", id, f))); try!(document(w, cx, field)); try!(write!(w, "