spotlight Iterator/Read/Write impls on function return types
This commit is contained in:
parent
aabfed5e0c
commit
cbe4ac3079
7 changed files with 99 additions and 15 deletions
|
@ -30,6 +30,7 @@ fn _assert_is_object_safe(_: &Iterator<Item=()>) {}
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[rustc_on_unimplemented = "`{Self}` is not an iterator; maybe try calling \
|
#[rustc_on_unimplemented = "`{Self}` is not an iterator; maybe try calling \
|
||||||
`.iter()` or a similar method"]
|
`.iter()` or a similar method"]
|
||||||
|
#[doc(spotlight)]
|
||||||
pub trait Iterator {
|
pub trait Iterator {
|
||||||
/// The type of the elements being iterated over.
|
/// The type of the elements being iterated over.
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
|
@ -140,11 +140,13 @@ pub fn build_external_trait(cx: &DocContext, did: DefId) -> clean::Trait {
|
||||||
let generics = (cx.tcx.generics_of(did), &predicates).clean(cx);
|
let generics = (cx.tcx.generics_of(did), &predicates).clean(cx);
|
||||||
let generics = filter_non_trait_generics(did, generics);
|
let generics = filter_non_trait_generics(did, generics);
|
||||||
let (generics, supertrait_bounds) = separate_supertrait_bounds(generics);
|
let (generics, supertrait_bounds) = separate_supertrait_bounds(generics);
|
||||||
|
let is_spotlight = load_attrs(cx, did).has_doc_flag("spotlight");
|
||||||
clean::Trait {
|
clean::Trait {
|
||||||
unsafety: cx.tcx.trait_def(did).unsafety,
|
unsafety: cx.tcx.trait_def(did).unsafety,
|
||||||
generics,
|
generics,
|
||||||
items: trait_items,
|
items: trait_items,
|
||||||
bounds: supertrait_bounds,
|
bounds: supertrait_bounds,
|
||||||
|
is_spotlight,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,7 @@ impl<'a, 'tcx> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx> {
|
||||||
match module.inner {
|
match module.inner {
|
||||||
ModuleItem(ref module) => {
|
ModuleItem(ref module) => {
|
||||||
for it in &module.items {
|
for it in &module.items {
|
||||||
if it.is_extern_crate() && it.attrs.has_doc_masked() {
|
if it.is_extern_crate() && it.attrs.has_doc_flag("masked") {
|
||||||
masked_crates.insert(it.def_id.krate);
|
masked_crates.insert(it.def_id.krate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -596,12 +596,12 @@ impl Attributes {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn has_doc_masked(&self) -> bool {
|
pub fn has_doc_flag(&self, flag: &str) -> bool {
|
||||||
for attr in &self.other_attrs {
|
for attr in &self.other_attrs {
|
||||||
if !attr.check_name("doc") { continue; }
|
if !attr.check_name("doc") { continue; }
|
||||||
|
|
||||||
if let Some(items) = attr.meta_item_list() {
|
if let Some(items) = attr.meta_item_list() {
|
||||||
if items.iter().filter_map(|i| i.meta_item()).any(|it| it.check_name("masked")) {
|
if items.iter().filter_map(|i| i.meta_item()).any(|it| it.check_name(flag)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1331,19 +1331,31 @@ impl Clean<FunctionRetTy> for hir::FunctionRetTy {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl GetDefId for FunctionRetTy {
|
||||||
|
fn def_id(&self) -> Option<DefId> {
|
||||||
|
match *self {
|
||||||
|
Return(ref ty) => ty.def_id(),
|
||||||
|
DefaultReturn => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
|
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
|
||||||
pub struct Trait {
|
pub struct Trait {
|
||||||
pub unsafety: hir::Unsafety,
|
pub unsafety: hir::Unsafety,
|
||||||
pub items: Vec<Item>,
|
pub items: Vec<Item>,
|
||||||
pub generics: Generics,
|
pub generics: Generics,
|
||||||
pub bounds: Vec<TyParamBound>,
|
pub bounds: Vec<TyParamBound>,
|
||||||
|
pub is_spotlight: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Clean<Item> for doctree::Trait {
|
impl Clean<Item> for doctree::Trait {
|
||||||
fn clean(&self, cx: &DocContext) -> Item {
|
fn clean(&self, cx: &DocContext) -> Item {
|
||||||
|
let attrs = self.attrs.clean(cx);
|
||||||
|
let is_spotlight = attrs.has_doc_flag("spotlight");
|
||||||
Item {
|
Item {
|
||||||
name: Some(self.name.clean(cx)),
|
name: Some(self.name.clean(cx)),
|
||||||
attrs: self.attrs.clean(cx),
|
attrs: attrs,
|
||||||
source: self.whence.clean(cx),
|
source: self.whence.clean(cx),
|
||||||
def_id: cx.tcx.hir.local_def_id(self.id),
|
def_id: cx.tcx.hir.local_def_id(self.id),
|
||||||
visibility: self.vis.clean(cx),
|
visibility: self.vis.clean(cx),
|
||||||
|
@ -1354,6 +1366,7 @@ impl Clean<Item> for doctree::Trait {
|
||||||
items: self.items.clean(cx),
|
items: self.items.clean(cx),
|
||||||
generics: self.generics.clean(cx),
|
generics: self.generics.clean(cx),
|
||||||
bounds: self.bounds.clean(cx),
|
bounds: self.bounds.clean(cx),
|
||||||
|
is_spotlight: is_spotlight,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1816,7 +1816,8 @@ fn plain_summary_line(s: Option<&str>) -> String {
|
||||||
|
|
||||||
fn document(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item) -> fmt::Result {
|
fn document(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item) -> fmt::Result {
|
||||||
document_stability(w, cx, item)?;
|
document_stability(w, cx, item)?;
|
||||||
let prefix = render_assoc_const_value(item);
|
let mut prefix = render_assoc_const_value(item);
|
||||||
|
prefix.push_str(&render_spotlight_traits(item)?);
|
||||||
document_full(w, item, cx, &prefix)?;
|
document_full(w, item, cx, &prefix)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -2603,7 +2604,7 @@ fn assoc_const(w: &mut fmt::Formatter,
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn assoc_type(w: &mut fmt::Formatter, it: &clean::Item,
|
fn assoc_type<W: fmt::Write>(w: &mut W, it: &clean::Item,
|
||||||
bounds: &Vec<clean::TyParamBound>,
|
bounds: &Vec<clean::TyParamBound>,
|
||||||
default: Option<&clean::Type>,
|
default: Option<&clean::Type>,
|
||||||
link: AssocItemLink) -> fmt::Result {
|
link: AssocItemLink) -> fmt::Result {
|
||||||
|
@ -3236,6 +3237,62 @@ fn should_render_item(item: &clean::Item, deref_mut_: bool) -> bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn render_spotlight_traits(item: &clean::Item) -> Result<String, fmt::Error> {
|
||||||
|
let mut out = String::new();
|
||||||
|
|
||||||
|
match item.inner {
|
||||||
|
clean::FunctionItem(clean::Function { ref decl, .. }) |
|
||||||
|
clean::TyMethodItem(clean::TyMethod { ref decl, .. }) |
|
||||||
|
clean::MethodItem(clean::Method { ref decl, .. }) |
|
||||||
|
clean::ForeignFunctionItem(clean::Function { ref decl, .. }) => {
|
||||||
|
out = spotlight_decl(decl)?;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn spotlight_decl(decl: &clean::FnDecl) -> Result<String, fmt::Error> {
|
||||||
|
let mut out = String::new();
|
||||||
|
|
||||||
|
if let Some(did) = decl.output.def_id() {
|
||||||
|
let c = cache();
|
||||||
|
if let Some(impls) = c.impls.get(&did) {
|
||||||
|
for i in impls {
|
||||||
|
let impl_ = i.inner_impl();
|
||||||
|
if impl_.trait_.def_id().and_then(|d| c.traits.get(&d))
|
||||||
|
.map_or(false, |t| t.is_spotlight) {
|
||||||
|
if out.is_empty() {
|
||||||
|
out.push_str("<span class=\"docblock autohide\">");
|
||||||
|
out.push_str(&format!("<h3>Important traits for {}</h3>", impl_.for_));
|
||||||
|
out.push_str("<code class=\"spotlight\">");
|
||||||
|
}
|
||||||
|
|
||||||
|
//use the "where" class here to make it small
|
||||||
|
out.push_str(&format!("<span class=\"where fmt-newline\">{}</span>", impl_));
|
||||||
|
let t_did = impl_.trait_.def_id().unwrap();
|
||||||
|
for it in &impl_.items {
|
||||||
|
if let clean::TypedefItem(ref tydef, _) = it.inner {
|
||||||
|
out.push_str("<span class=\"where fmt-newline\"> ");
|
||||||
|
assoc_type(&mut out, it, &vec![],
|
||||||
|
Some(&tydef.type_),
|
||||||
|
AssocItemLink::GotoSource(t_did, &FxHashSet()))?;
|
||||||
|
out.push_str(";</span>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !out.is_empty() {
|
||||||
|
out.push_str("</code></span>");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(out)
|
||||||
|
}
|
||||||
|
|
||||||
fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLink,
|
fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLink,
|
||||||
render_mode: RenderMode, outer_version: Option<&str>,
|
render_mode: RenderMode, outer_version: Option<&str>,
|
||||||
show_def_docs: bool) -> fmt::Result {
|
show_def_docs: bool) -> fmt::Result {
|
||||||
|
@ -3270,6 +3327,7 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
|
||||||
trait_: Option<&clean::Trait>, show_def_docs: bool) -> fmt::Result {
|
trait_: Option<&clean::Trait>, show_def_docs: bool) -> fmt::Result {
|
||||||
let item_type = item.type_();
|
let item_type = item.type_();
|
||||||
let name = item.name.as_ref().unwrap();
|
let name = item.name.as_ref().unwrap();
|
||||||
|
let mut method_prefix: Option<String> = None;
|
||||||
|
|
||||||
let render_method_item: bool = match render_mode {
|
let render_method_item: bool = match render_mode {
|
||||||
RenderMode::Normal => true,
|
RenderMode::Normal => true,
|
||||||
|
@ -3277,7 +3335,8 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
|
||||||
};
|
};
|
||||||
|
|
||||||
match item.inner {
|
match item.inner {
|
||||||
clean::MethodItem(..) | clean::TyMethodItem(..) => {
|
clean::MethodItem(clean::Method { ref decl, .. }) |
|
||||||
|
clean::TyMethodItem(clean::TyMethod{ ref decl, .. }) => {
|
||||||
// Only render when the method is not static or we allow static methods
|
// Only render when the method is not static or we allow static methods
|
||||||
if render_method_item {
|
if render_method_item {
|
||||||
let id = derive_id(format!("{}.{}", item_type, name));
|
let id = derive_id(format!("{}.{}", item_type, name));
|
||||||
|
@ -3297,6 +3356,7 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
|
||||||
render_stability_since_raw(w, item.stable_since(), outer_version)?;
|
render_stability_since_raw(w, item.stable_since(), outer_version)?;
|
||||||
}
|
}
|
||||||
write!(w, "</span></h4>\n")?;
|
write!(w, "</span></h4>\n")?;
|
||||||
|
method_prefix = Some(spotlight_decl(decl)?);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clean::TypedefItem(ref tydef, _) => {
|
clean::TypedefItem(ref tydef, _) => {
|
||||||
|
@ -3328,7 +3388,12 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
|
||||||
}
|
}
|
||||||
|
|
||||||
if render_method_item || render_mode == RenderMode::Normal {
|
if render_method_item || render_mode == RenderMode::Normal {
|
||||||
let prefix = render_assoc_const_value(item);
|
let mut prefix = render_assoc_const_value(item);
|
||||||
|
|
||||||
|
if let Some(method_prefix) = method_prefix {
|
||||||
|
prefix.push_str(&method_prefix);
|
||||||
|
}
|
||||||
|
|
||||||
if !is_default_item {
|
if !is_default_item {
|
||||||
if let Some(t) = trait_ {
|
if let Some(t) = trait_ {
|
||||||
// The trait item may have been stripped so we might not
|
// The trait item may have been stripped so we might not
|
||||||
|
|
|
@ -1624,9 +1624,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
onEach(document.getElementById('main').getElementsByClassName('docblock'), function(e) {
|
onEach(document.getElementById('main').getElementsByClassName('docblock'), function(e) {
|
||||||
if (e.parentNode.id === "main") {
|
|
||||||
e.parentNode.insertBefore(createToggle(), e);
|
e.parentNode.insertBefore(createToggle(), e);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
onEach(document.getElementsByClassName('docblock'), function(e) {
|
onEach(document.getElementsByClassName('docblock'), function(e) {
|
||||||
|
|
|
@ -141,9 +141,12 @@ code, pre {
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: 0 0.2em;
|
padding: 0 0.2em;
|
||||||
}
|
}
|
||||||
.docblock pre code, .docblock-short pre code {
|
.docblock pre code, .docblock-short pre code, .docblock code.spotlight {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
.docblock code.spotlight :last-child {
|
||||||
|
padding-bottom: 0.6em;
|
||||||
|
}
|
||||||
pre {
|
pre {
|
||||||
padding: 14px;
|
padding: 14px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -450,6 +450,7 @@ fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize>
|
||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[doc(spotlight)]
|
||||||
pub trait Read {
|
pub trait Read {
|
||||||
/// Pull some bytes from this source into the specified buffer, returning
|
/// Pull some bytes from this source into the specified buffer, returning
|
||||||
/// how many bytes were read.
|
/// how many bytes were read.
|
||||||
|
@ -968,6 +969,7 @@ impl Initializer {
|
||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[doc(spotlight)]
|
||||||
pub trait Write {
|
pub trait Write {
|
||||||
/// Write a buffer into this object, returning how many bytes were written.
|
/// Write a buffer into this object, returning how many bytes were written.
|
||||||
///
|
///
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue