}
};
+ let mut have_impls = false;
let mut implementors = format!(r#"implementors["{}"] = ["#, krate.name);
for imp in imps {
// If the trait and implementation are in the same crate, then
// 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 }
+ // If the implementation is from another crate then that crate
+ // should add it.
+ if !imp.def_id.is_local() { continue }
+ have_impls = true;
write!(implementors, "{},", as_json(&imp.impl_.to_string())).unwrap();
}
implementors.push_str("];");
+ // Only create a js file if we have impls to add to it. If the trait is
+ // documented locally though we always create the file to avoid dead
+ // links.
+ if !have_impls && !cache.paths.contains_key(&did) {
+ continue;
+ }
+
let mut mydst = dst.clone();
for part in &remote_path[..remote_path.len() - 1] {
mydst.push(part);
stability.push(format!("<div class='stab deprecated'>{}</div>", text))
}
+ if let Some(ref cfg) = item.attrs.cfg {
+ stability.push(format!("<div class='stab portability'>{}</div>", if show_reason {
+ cfg.render_long_html()
+ } else {
+ cfg.render_short_html()
+ }));
+ }
+
stability
}
if !types.is_empty() {
write!(w, "
- <h2 id='associated-types'>Associated Types</h2>
+ <h2 id='associated-types' class='small-section-header'>
+ Associated Types<a href='#associated-types' class='anchor'></a>
+ </h2>
<div class='methods'>
")?;
for t in &types {
if !consts.is_empty() {
write!(w, "
- <h2 id='associated-const'>Associated Constants</h2>
+ <h2 id='associated-const' class='small-section-header'>
+ Associated Constants<a href='#associated-const' class='anchor'></a>
+ </h2>
<div class='methods'>
")?;
for t in &consts {
// Output the documentation for each function individually
if !required.is_empty() {
write!(w, "
- <h2 id='required-methods'>Required Methods</h2>
+ <h2 id='required-methods' class='small-section-header'>
+ Required Methods<a href='#required-methods' class='anchor'></a>
+ </h2>
<div class='methods'>
")?;
for m in &required {
}
if !provided.is_empty() {
write!(w, "
- <h2 id='provided-methods'>Provided Methods</h2>
+ <h2 id='provided-methods' class='small-section-header'>
+ Provided Methods<a href='#provided-methods' class='anchor'></a>
+ </h2>
<div class='methods'>
")?;
for m in &provided {
let cache = cache();
write!(w, "
- <h2 id='implementors'>Implementors</h2>
+ <h2 id='implementors' class='small-section-header'>
+ Implementors<a href='#implementors' class='anchor'></a>
+ </h2>
<ul class='item-list' id='implementors-list'>
")?;
if let Some(implementors) = cache.implementors.get(&it.def_id) {
_ => false,
};
fmt_impl_for_trait_page(&implementor.impl_, w, use_absolute)?;
+ for it in &implementor.impl_.items {
+ if let clean::TypedefItem(ref tydef, _) = it.inner {
+ write!(w, "<span class=\"where fmt-newline\"> ")?;
+ assoc_type(w, it, &vec![], Some(&tydef.type_), AssocItemLink::Anchor(None))?;
+ write!(w, ";</span>")?;
+ }
+ }
writeln!(w, "</code></li>")?;
}
}
}).peekable();
if let doctree::Plain = s.struct_type {
if fields.peek().is_some() {
- write!(w, "<h2 id='fields' class='fields'>Fields</h2>")?;
+ write!(w, "<h2 id='fields' class='fields small-section-header'>
+ Fields<a href='#fields' class='anchor'></a></h2>")?;
for (field, ty) in fields {
let id = derive_id(format!("{}.{}",
ItemType::StructField,
}
}).peekable();
if fields.peek().is_some() {
- write!(w, "<h2 id='fields' class='fields'>Fields</h2>")?;
+ write!(w, "<h2 id='fields' class='fields small-section-header'>
+ Fields<a href='#fields' class='anchor'></a></h2>")?;
for (field, ty) in fields {
write!(w, "<span id='{shortty}.{name}' class=\"{shortty}\"><code>{name}: {ty}</code>
</span>",
document(w, cx, it)?;
if !e.variants.is_empty() {
- write!(w, "<h2 id='variants' class='variants'>Variants</h2>\n")?;
+ write!(w, "<h2 id='variants' class='variants small-section-header'>
+ Variants<a href='#variants' class='anchor'></a></h2>\n")?;
for variant in &e.variants {
let id = derive_id(format!("{}.{}",
ItemType::Variant,
if !non_trait.is_empty() {
let render_mode = match what {
AssocItemRender::All => {
- write!(w, "<h2 id='methods'>Methods</h2>")?;
+ write!(w, "
+ <h2 id='methods' class='small-section-header'>
+ Methods<a href='#methods' class='anchor'></a>
+ </h2>
+ ")?;
RenderMode::Normal
}
AssocItemRender::DerefFor { trait_, type_, deref_mut_ } => {
- write!(w, "<h2 id='deref-methods'>Methods from \
- {}<Target = {}></h2>", trait_, type_)?;
+ write!(w, "
+ <h2 id='deref-methods' class='small-section-header'>
+ Methods from {}<Target = {}><a href='#deref-methods' class='anchor'></a>
+ </h2>
+ ", trait_, type_)?;
RenderMode::ForDeref { mut_: deref_mut_ }
}
};
}).is_some();
render_deref_methods(w, cx, impl_, containing_item, has_deref_mut)?;
}
- write!(w, "<h2 id='implementations'>Trait \
- Implementations</h2>")?;
+ write!(w, "
+ <h2 id='implementations' class='small-section-header'>
+ Trait Implementations<a href='#implementations' class='anchor'></a>
+ </h2>
+ ")?;
for i in &traits {
let did = i.trait_did().unwrap();
let assoc_link = AssocItemLink::GotoSource(did, &i.inner_impl().provided_trait_methods);