1
Fork 0

Auto merge of #55798 - GuillaumeGomez:version-display-associated-const, r=QuietMisdreavus

Add version display for associated consts

Fixes #54030.

<img width="1440" alt="screenshot 2018-11-08 at 23 57 29" src="https://user-images.githubusercontent.com/3050060/48232648-99decf00-e3b2-11e8-9f41-6bd12a161c7d.png">

r? @QuietMisdreavus
This commit is contained in:
bors 2018-12-21 01:58:16 +00:00
commit 6d34ec18c7
4 changed files with 79 additions and 33 deletions

View file

@ -3037,15 +3037,14 @@ fn item_trait(
let item_type = m.type_(); let item_type = m.type_();
let id = cx.derive_id(format!("{}.{}", item_type, name)); let id = cx.derive_id(format!("{}.{}", item_type, name));
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space())); let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
write!(w, "{extra}<h3 id='{id}' class='method'>\ write!(w, "{extra}<h3 id='{id}' class='method'><code id='{ns_id}'>",
<span id='{ns_id}' class='invisible'><code>",
extra = render_spotlight_traits(m)?, extra = render_spotlight_traits(m)?,
id = id, id = id,
ns_id = ns_id)?; ns_id = ns_id)?;
render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl)?; render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl)?;
write!(w, "</code>")?; write!(w, "</code>")?;
render_stability_since(w, m, t)?; render_stability_since(w, m, t)?;
write!(w, "</span></h3>")?; write!(w, "</h3>")?;
document(w, cx, m)?; document(w, cx, m)?;
Ok(()) Ok(())
} }
@ -3237,13 +3236,14 @@ fn assoc_type<W: fmt::Write>(w: &mut W, it: &clean::Item,
Ok(()) Ok(())
} }
fn render_stability_since_raw<'a>(w: &mut fmt::Formatter, fn render_stability_since_raw<'a, T: fmt::Write>(
ver: Option<&'a str>, w: &mut T,
containing_ver: Option<&'a str>) -> fmt::Result { ver: Option<&'a str>,
containing_ver: Option<&'a str>,
) -> fmt::Result {
if let Some(v) = ver { if let Some(v) = ver {
if containing_ver != ver && v.len() > 0 { if containing_ver != ver && v.len() > 0 {
write!(w, "<div class='since' title='Stable since Rust version {0}'>{0}</div>", write!(w, "<div class='since' title='Stable since Rust version {0}'>{0}</div>", v)?
v)?
} }
} }
Ok(()) Ok(())
@ -3373,11 +3373,10 @@ fn item_struct(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
let ns_id = cx.derive_id(format!("{}.{}", let ns_id = cx.derive_id(format!("{}.{}",
field.name.as_ref().unwrap(), field.name.as_ref().unwrap(),
ItemType::StructField.name_space())); ItemType::StructField.name_space()));
write!(w, "<span id=\"{id}\" class=\"{item_type} small-section-header\"> write!(w, "<span id=\"{id}\" class=\"{item_type} small-section-header\">\
<a href=\"#{id}\" class=\"anchor field\"></a> <a href=\"#{id}\" class=\"anchor field\"></a>\
<span id=\"{ns_id}\" class='invisible'> <code id=\"{ns_id}\">{name}: {ty}</code>\
<code>{name}: {ty}</code> </span>",
</span></span>",
item_type = ItemType::StructField, item_type = ItemType::StructField,
id = id, id = id,
ns_id = ns_id, ns_id = ns_id,
@ -3509,7 +3508,7 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
ItemType::Variant.name_space())); ItemType::Variant.name_space()));
write!(w, "<span id=\"{id}\" class=\"variant small-section-header\">\ write!(w, "<span id=\"{id}\" class=\"variant small-section-header\">\
<a href=\"#{id}\" class=\"anchor field\"></a>\ <a href=\"#{id}\" class=\"anchor field\"></a>\
<span id='{ns_id}' class='invisible'><code>{name}", <code id='{ns_id}'>{name}",
id = id, id = id,
ns_id = ns_id, ns_id = ns_id,
name = variant.name.as_ref().unwrap())?; name = variant.name.as_ref().unwrap())?;
@ -3525,7 +3524,7 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
write!(w, ")")?; write!(w, ")")?;
} }
} }
write!(w, "</code></span></span>")?; write!(w, "</code></span>")?;
document(w, cx, variant)?; document(w, cx, variant)?;
use clean::{Variant, VariantKind}; use clean::{Variant, VariantKind};
@ -3552,8 +3551,8 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
ItemType::StructField.name_space())); ItemType::StructField.name_space()));
write!(w, "<span id=\"{id}\" class=\"variant small-section-header\">\ write!(w, "<span id=\"{id}\" class=\"variant small-section-header\">\
<a href=\"#{id}\" class=\"anchor field\"></a>\ <a href=\"#{id}\" class=\"anchor field\"></a>\
<span id='{ns_id}' class='invisible'><code>{f}:&nbsp;{t}\ <code id='{ns_id}'>{f}:&nbsp;{t}\
</code></span></span>", </code></span>",
id = id, id = id,
ns_id = ns_id, ns_id = ns_id,
f = field.name.as_ref().unwrap(), f = field.name.as_ref().unwrap(),
@ -3998,7 +3997,7 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
id, i.inner_impl())?; id, i.inner_impl())?;
} }
write!(w, "<a href='#{}' class='anchor'></a>", id)?; write!(w, "<a href='#{}' class='anchor'></a>", id)?;
write!(w, "</span></td><td><span class='out-of-band'>")?; write!(w, "</td><td><span class='out-of-band'>")?;
let since = i.impl_item.stability.as_ref().map(|s| &s.since[..]); let since = i.impl_item.stability.as_ref().map(|s| &s.since[..]);
if let Some(l) = (Item { item: &i.impl_item, cx: cx }).src_href() { if let Some(l) = (Item { item: &i.impl_item, cx: cx }).src_href() {
write!(w, "<div class='ghost'></div>")?; write!(w, "<div class='ghost'></div>")?;
@ -4008,7 +4007,7 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
} else { } else {
render_stability_since_raw(w, since, outer_version)?; render_stability_since_raw(w, since, outer_version)?;
} }
write!(w, "</span></td></tr></tbody></table></h3>")?; write!(w, "</span></td></tr></tbody></table></span></h3>")?;
if let Some(ref dox) = cx.shared.maybe_collapsed_doc_value(&i.impl_item) { if let Some(ref dox) = cx.shared.maybe_collapsed_doc_value(&i.impl_item) {
let mut ids = cx.id_map.borrow_mut(); let mut ids = cx.id_map.borrow_mut();
write!(w, "<div class='docblock'>{}</div>", write!(w, "<div class='docblock'>{}</div>",
@ -4044,52 +4043,73 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space())); let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class)?; write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class)?;
write!(w, "{}", spotlight_decl(decl)?)?; write!(w, "{}", spotlight_decl(decl)?)?;
write!(w, "<span id='{}' class='invisible'>", ns_id)?; write!(w, "<table id='{}' class='table-display'><tbody><tr><td><code>", ns_id)?;
write!(w, "<table class='table-display'><tbody><tr><td><code>")?;
render_assoc_item(w, item, link.anchor(&id), ItemType::Impl)?; render_assoc_item(w, item, link.anchor(&id), ItemType::Impl)?;
write!(w, "</code>")?; write!(w, "</code>")?;
if let Some(l) = (Item { cx, item }).src_href() { if let Some(l) = (Item { cx, item }).src_href() {
write!(w, "</span></td><td><span class='out-of-band'>")?; write!(w, "</td><td><span class='out-of-band'>")?;
write!(w, "<div class='ghost'></div>")?; write!(w, "<div class='ghost'></div>")?;
render_stability_since_raw(w, item.stable_since(), outer_version)?; render_stability_since_raw(w, item.stable_since(), outer_version)?;
write!(w, "<a class='srclink' href='{}' title='{}'>[src]</a>", write!(w, "<a class='srclink' href='{}' title='{}'>[src]</a></span>",
l, "goto source code")?; l, "goto source code")?;
} else { } else {
write!(w, "</td><td>")?; write!(w, "</td><td>")?;
render_stability_since_raw(w, item.stable_since(), outer_version)?; render_stability_since_raw(w, item.stable_since(), outer_version)?;
} }
write!(w, "</td></tr></tbody></table></span></h4>")?; write!(w, "</td></tr></tbody></table></h4>")?;
} }
} }
clean::TypedefItem(ref tydef, _) => { clean::TypedefItem(ref tydef, _) => {
let id = cx.derive_id(format!("{}.{}", ItemType::AssociatedType, name)); let id = cx.derive_id(format!("{}.{}", ItemType::AssociatedType, name));
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space())); let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class)?; write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class)?;
write!(w, "<span id='{}' class='invisible'><code>", ns_id)?; write!(w, "<code id='{}'>", ns_id)?;
assoc_type(w, item, &Vec::new(), Some(&tydef.type_), link.anchor(&id))?; assoc_type(w, item, &Vec::new(), Some(&tydef.type_), link.anchor(&id))?;
write!(w, "</code></span></h4>\n")?; write!(w, "</code></h4>")?;
} }
clean::AssociatedConstItem(ref ty, ref default) => { clean::AssociatedConstItem(ref ty, ref default) => {
let mut version = String::new();
render_stability_since_raw(&mut version, item.stable_since(), outer_version)?;
let id = cx.derive_id(format!("{}.{}", item_type, name)); let id = cx.derive_id(format!("{}.{}", item_type, name));
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space())); let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class)?; write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class)?;
write!(w, "<span id='{}' class='invisible'><code>", ns_id)?; if !version.is_empty() {
write!(w, "<table id='{}' class='table-display'><tbody><tr><td><code>", ns_id)?;
} else {
write!(w, "<code id='{}'>", ns_id)?;
}
assoc_const(w, item, ty, default.as_ref(), link.anchor(&id))?; assoc_const(w, item, ty, default.as_ref(), link.anchor(&id))?;
if !version.is_empty() {
write!(w, "</code>")?;
}
let src = if let Some(l) = (Item { cx, item }).src_href() { let src = if let Some(l) = (Item { cx, item }).src_href() {
if !version.is_empty() {
write!(w, "</td><td><span class='out-of-band'>")?;
write!(w, "<div class='ghost'></div>{}", version)?;
}
format!("<a class='srclink' href='{}' title='{}'>[src]</a>", format!("<a class='srclink' href='{}' title='{}'>[src]</a>",
l, "goto source code") l, "goto source code")
} else { } else {
if !version.is_empty() {
write!(w, "</td><td>{}", version)?;
}
String::new() String::new()
}; };
write!(w, "</code>{}</span></h4>\n", src)?; if version.is_empty() {
write!(w, "</code>{}</h4>", src)?;
} else {
write!(w, "{}</span></td></tr></tbody></table></h4>", src)?;
}
} }
clean::AssociatedTypeItem(ref bounds, ref default) => { clean::AssociatedTypeItem(ref bounds, ref default) => {
let id = cx.derive_id(format!("{}.{}", item_type, name)); let id = cx.derive_id(format!("{}.{}", item_type, name));
let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space())); let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space()));
write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class)?; write!(w, "<h4 id='{}' class=\"{}{}\">", id, item_type, extra_class)?;
write!(w, "<span id='{}' class='invisible'><code>", ns_id)?; write!(w, "<code id='{}'>", ns_id)?;
assoc_type(w, item, bounds, default.as_ref(), link.anchor(&id))?; assoc_type(w, item, bounds, default.as_ref(), link.anchor(&id))?;
write!(w, "</code></span></h4>\n")?; write!(w, "</code></h4>")?;
} }
clean::StrippedItem(..) => return Ok(()), clean::StrippedItem(..) => return Ok(()),
_ => panic!("can't make docs for trait item with name {:?}", item.name) _ => panic!("can't make docs for trait item with name {:?}", item.name)

View file

@ -611,7 +611,7 @@ a {
text-decoration: underline; text-decoration: underline;
} }
.invisible > .srclink { .invisible > .srclink, h4 > code + .srclink {
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;

View file

@ -0,0 +1,26 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// ignore-tidy-linelength
#![crate_name = "foo"]
#![feature(staged_api)]
#![stable(since="1.1.1", feature="rust1")]
#[stable(since="1.1.1", feature="rust1")]
pub struct SomeStruct;
impl SomeStruct {
// @has 'foo/struct.SomeStruct.html' '//*[@id="SOME_CONST.v"]//div[@class="since"]' '1.1.2'
#[stable(since="1.1.2", feature="rust2")]
pub const SOME_CONST: usize = 0;
}

View file

@ -15,9 +15,9 @@
// @has assoc_types/trait.Index.html // @has assoc_types/trait.Index.html
pub trait Index<I: ?Sized> { pub trait Index<I: ?Sized> {
// @has - '//*[@id="associatedtype.Output"]//code' 'type Output: ?Sized' // @has - '//*[@id="associatedtype.Output"]//code' 'type Output: ?Sized'
// @has - '//*[@id="Output.t"]//code' 'type Output: ?Sized' // @has - '//code[@id="Output.t"]' 'type Output: ?Sized'
type Output: ?Sized; type Output: ?Sized;
// @has - '//*[@id="index.v"]//code' 'fn index' // @has - '//code[@id="index.v"]' 'fn index'
// @has - '//*[@id="tymethod.index"]//code' \ // @has - '//*[@id="tymethod.index"]//code' \
// "fn index<'a>(&'a self, index: I) -> &'a Self::Output" // "fn index<'a>(&'a self, index: I) -> &'a Self::Output"
// @has - '//*[@id="tymethod.index"]//code//a[@href="../assoc_types/trait.Index.html#associatedtype.Output"]' \ // @has - '//*[@id="tymethod.index"]//code//a[@href="../assoc_types/trait.Index.html#associatedtype.Output"]' \