1
Fork 0

Add default keyword handling in rustdoc

This commit is contained in:
Guillaume Gomez 2019-03-05 02:29:21 +01:00
parent 8bf1f1c8f4
commit 541ad45a83
4 changed files with 51 additions and 7 deletions

View file

@ -507,6 +507,18 @@ impl Item {
.as_ref() .as_ref()
.or_else(|| self.stability.as_ref().and_then(|s| s.deprecation.as_ref())) .or_else(|| self.stability.as_ref().and_then(|s| s.deprecation.as_ref()))
} }
pub fn is_default(&self) -> bool {
match self.inner {
ItemEnum::MethodItem(ref meth) => {
if let Some(defaultness) = meth.defaultness {
defaultness.has_value() && !defaultness.is_final()
} else {
false
}
}
_ => false,
}
}
} }
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)] #[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
@ -1699,9 +1711,11 @@ pub struct Method {
pub generics: Generics, pub generics: Generics,
pub decl: FnDecl, pub decl: FnDecl,
pub header: hir::FnHeader, pub header: hir::FnHeader,
pub defaultness: Option<hir::Defaultness>,
} }
impl<'a> Clean<Method> for (&'a hir::MethodSig, &'a hir::Generics, hir::BodyId) { impl<'a> Clean<Method> for (&'a hir::MethodSig, &'a hir::Generics, hir::BodyId,
Option<hir::Defaultness>) {
fn clean(&self, cx: &DocContext<'_>) -> Method { fn clean(&self, cx: &DocContext<'_>) -> Method {
let (generics, decl) = enter_impl_trait(cx, || { let (generics, decl) = enter_impl_trait(cx, || {
(self.1.clean(cx), (&*self.0.decl, self.2).clean(cx)) (self.1.clean(cx), (&*self.0.decl, self.2).clean(cx))
@ -1710,6 +1724,7 @@ impl<'a> Clean<Method> for (&'a hir::MethodSig, &'a hir::Generics, hir::BodyId)
decl, decl,
generics, generics,
header: self.0.header, header: self.0.header,
defaultness: self.3,
} }
} }
} }
@ -2015,7 +2030,7 @@ impl Clean<Item> for hir::TraitItem {
default.map(|e| print_const_expr(cx, e))) default.map(|e| print_const_expr(cx, e)))
} }
hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => { hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => {
MethodItem((sig, &self.generics, body).clean(cx)) MethodItem((sig, &self.generics, body, None).clean(cx))
} }
hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(ref names)) => { hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(ref names)) => {
let (generics, decl) = enter_impl_trait(cx, || { let (generics, decl) = enter_impl_trait(cx, || {
@ -2053,7 +2068,7 @@ impl Clean<Item> for hir::ImplItem {
Some(print_const_expr(cx, expr))) Some(print_const_expr(cx, expr)))
} }
hir::ImplItemKind::Method(ref sig, body) => { hir::ImplItemKind::Method(ref sig, body) => {
MethodItem((sig, &self.generics, body).clean(cx)) MethodItem((sig, &self.generics, body, Some(self.defaultness)).clean(cx))
} }
hir::ImplItemKind::Type(ref ty) => TypedefItem(Typedef { hir::ImplItemKind::Type(ref ty) => TypedefItem(Typedef {
type_: ty.clean(cx), type_: ty.clean(cx),
@ -2136,7 +2151,8 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
abi: sig.abi(), abi: sig.abi(),
constness, constness,
asyncness: hir::IsAsync::NotAsync, asyncness: hir::IsAsync::NotAsync,
} },
defaultness: Some(self.defaultness),
}) })
} else { } else {
TyMethodItem(TyMethod { TyMethodItem(TyMethod {

View file

@ -45,6 +45,7 @@ pub struct GenericBounds<'a>(pub &'a [clean::GenericBound]);
/// Wrapper struct for emitting a comma-separated list of items /// Wrapper struct for emitting a comma-separated list of items
pub struct CommaSep<'a, T>(pub &'a [T]); pub struct CommaSep<'a, T>(pub &'a [T]);
pub struct AbiSpace(pub Abi); pub struct AbiSpace(pub Abi);
pub struct DefaultSpace(pub bool);
/// Wrapper struct for properly emitting a function or method declaration. /// Wrapper struct for properly emitting a function or method declaration.
pub struct Function<'a> { pub struct Function<'a> {
@ -1057,3 +1058,13 @@ impl fmt::Display for AbiSpace {
} }
} }
} }
impl fmt::Display for DefaultSpace {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.0 {
write!(f, "default ")
} else {
Ok(())
}
}
}

View file

@ -61,7 +61,7 @@ use crate::doctree;
use crate::fold::DocFolder; use crate::fold::DocFolder;
use crate::html::escape::Escape; use crate::html::escape::Escape;
use crate::html::format::{AsyncSpace, ConstnessSpace}; use crate::html::format::{AsyncSpace, ConstnessSpace};
use crate::html::format::{GenericBounds, WhereClause, href, AbiSpace}; use crate::html::format::{GenericBounds, WhereClause, href, AbiSpace, DefaultSpace};
use crate::html::format::{VisSpace, Function, UnsafetySpace, MutableSpace}; use crate::html::format::{VisSpace, Function, UnsafetySpace, MutableSpace};
use crate::html::format::fmt_impl_for_trait_page; use crate::html::format::fmt_impl_for_trait_page;
use crate::html::item_type::ItemType; use crate::html::item_type::ItemType;
@ -3434,11 +3434,12 @@ fn render_assoc_item(w: &mut fmt::Formatter<'_>,
} }
}; };
let mut header_len = format!( let mut header_len = format!(
"{}{}{}{}{:#}fn {}{:#}", "{}{}{}{}{}{:#}fn {}{:#}",
VisSpace(&meth.visibility), VisSpace(&meth.visibility),
ConstnessSpace(header.constness), ConstnessSpace(header.constness),
UnsafetySpace(header.unsafety), UnsafetySpace(header.unsafety),
AsyncSpace(header.asyncness), AsyncSpace(header.asyncness),
DefaultSpace(meth.is_default()),
AbiSpace(header.abi), AbiSpace(header.abi),
name, name,
*g *g
@ -3450,12 +3451,13 @@ fn render_assoc_item(w: &mut fmt::Formatter<'_>,
(0, true) (0, true)
}; };
render_attributes(w, meth)?; render_attributes(w, meth)?;
write!(w, "{}{}{}{}{}fn <a href='{href}' class='fnname'>{name}</a>\ write!(w, "{}{}{}{}{}{}fn <a href='{href}' class='fnname'>{name}</a>\
{generics}{decl}{where_clause}", {generics}{decl}{where_clause}",
VisSpace(&meth.visibility), VisSpace(&meth.visibility),
ConstnessSpace(header.constness), ConstnessSpace(header.constness),
UnsafetySpace(header.unsafety), UnsafetySpace(header.unsafety),
AsyncSpace(header.asyncness), AsyncSpace(header.asyncness),
DefaultSpace(meth.is_default()),
AbiSpace(header.abi), AbiSpace(header.abi),
href = href, href = href,
name = name, name = name,

View file

@ -0,0 +1,15 @@
#![feature(specialization)]
pub trait Item {
fn foo();
fn bar();
}
// @has default_trait_method/trait.Item.html
// @has - '//*[@id="method.foo"]' 'default fn foo()'
// @has - '//*[@id="method.bar"]' 'fn bar()'
// @!has - '//*[@id="method.bar"]' 'default fn bar()'
impl<T: ?Sized> Item for T {
default fn foo() {}
fn bar() {}
}