Rollup merge of #36679 - QuietMisdreavus:rustdoc-line-breaks, r=steveklabnik
rustdoc: print non-self arguments of bare functions and struct methods on their own line This change alters the formatting rustdoc uses when it creates function and struct method documentation. For bare functions, each argument is printed on its own line. For struct methods, non-self arguments are printed on their own line. In both cases, no line breaks are introduced if there are no arguments, and for struct methods, no line breaks are introduced if there is only a single self argument. This should aid readability of long function signatures and allow for greater comprehension of these functions. I've run rustdoc with these changes on my crate egg-mode and its set of dependencies and put the result [on my server](https://shiva.icesoldier.me/doc-custom/egg_mode/). Of note, here are a few shortcut links that highlight the changes: * [Bare function with a long signature](https://shiva.icesoldier.me/doc-custom/egg_mode/place/fn.reverse_geocode.html) * [Struct methods, with single self argument and with self and non-self arguments](https://shiva.icesoldier.me/doc-custom/egg_mode/tweet/struct.Timeline.html#method.reset) * [Bare functions with no arguments](https://shiva.icesoldier.me/doc-custom/rand/fn.thread_rng.html) and [struct methods with no arguments](https://shiva.icesoldier.me/doc-custom/hyper/client/struct.Client.html#method.new) are left unchanged. This PR consists of two commits: one for bare functions and one for struct methods.
This commit is contained in:
commit
6717dba276
3 changed files with 356 additions and 102 deletions
|
@ -42,7 +42,7 @@ pub struct UnsafetySpace(pub hir::Unsafety);
|
|||
#[derive(Copy, Clone)]
|
||||
pub struct ConstnessSpace(pub hir::Constness);
|
||||
/// Wrapper struct for properly emitting a method declaration.
|
||||
pub struct Method<'a>(pub &'a clean::FnDecl);
|
||||
pub struct Method<'a>(pub &'a clean::FnDecl, pub &'a str);
|
||||
/// Similar to VisSpace, but used for mutability
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct MutableSpace(pub clean::Mutability);
|
||||
|
@ -84,7 +84,7 @@ impl<'a, T: fmt::Display> fmt::Display for CommaSep<'a, T> {
|
|||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
for (i, item) in self.0.iter().enumerate() {
|
||||
if i != 0 { write!(f, ", ")?; }
|
||||
write!(f, "{}", item)?;
|
||||
fmt::Display::fmt(item, f)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ impl<'a> fmt::Display for TyParamBounds<'a> {
|
|||
if i > 0 {
|
||||
f.write_str(" + ")?;
|
||||
}
|
||||
write!(f, "{}", *bound)?;
|
||||
fmt::Display::fmt(bound, f)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -106,35 +106,51 @@ impl<'a> fmt::Display for TyParamBounds<'a> {
|
|||
impl fmt::Display for clean::Generics {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
if self.lifetimes.is_empty() && self.type_params.is_empty() { return Ok(()) }
|
||||
f.write_str("<")?;
|
||||
if f.alternate() {
|
||||
f.write_str("<")?;
|
||||
} else {
|
||||
f.write_str("<")?;
|
||||
}
|
||||
|
||||
for (i, life) in self.lifetimes.iter().enumerate() {
|
||||
if i > 0 {
|
||||
f.write_str(", ")?;
|
||||
f.write_str(", ")?;
|
||||
}
|
||||
write!(f, "{}", *life)?;
|
||||
}
|
||||
|
||||
if !self.type_params.is_empty() {
|
||||
if !self.lifetimes.is_empty() {
|
||||
f.write_str(", ")?;
|
||||
f.write_str(", ")?;
|
||||
}
|
||||
for (i, tp) in self.type_params.iter().enumerate() {
|
||||
if i > 0 {
|
||||
f.write_str(", ")?
|
||||
f.write_str(", ")?
|
||||
}
|
||||
f.write_str(&tp.name)?;
|
||||
|
||||
if !tp.bounds.is_empty() {
|
||||
write!(f, ": {}", TyParamBounds(&tp.bounds))?;
|
||||
if f.alternate() {
|
||||
write!(f, ": {:#}", TyParamBounds(&tp.bounds))?;
|
||||
} else {
|
||||
write!(f, ": {}", TyParamBounds(&tp.bounds))?;
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(ref ty) = tp.default {
|
||||
write!(f, " = {}", ty)?;
|
||||
if f.alternate() {
|
||||
write!(f, " = {:#}", ty)?;
|
||||
} else {
|
||||
write!(f, " = {}", ty)?;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
f.write_str(">")?;
|
||||
if f.alternate() {
|
||||
f.write_str(">")?;
|
||||
} else {
|
||||
f.write_str(">")?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
@ -145,7 +161,11 @@ impl<'a> fmt::Display for WhereClause<'a> {
|
|||
if gens.where_predicates.is_empty() {
|
||||
return Ok(());
|
||||
}
|
||||
f.write_str(" <span class='where'>where ")?;
|
||||
if f.alternate() {
|
||||
f.write_str(" ")?;
|
||||
} else {
|
||||
f.write_str(" <span class='where'>where ")?;
|
||||
}
|
||||
for (i, pred) in gens.where_predicates.iter().enumerate() {
|
||||
if i > 0 {
|
||||
f.write_str(", ")?;
|
||||
|
@ -153,7 +173,11 @@ impl<'a> fmt::Display for WhereClause<'a> {
|
|||
match pred {
|
||||
&clean::WherePredicate::BoundPredicate { ref ty, ref bounds } => {
|
||||
let bounds = bounds;
|
||||
write!(f, "{}: {}", ty, TyParamBounds(bounds))?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}: {:#}", ty, TyParamBounds(bounds))?;
|
||||
} else {
|
||||
write!(f, "{}: {}", ty, TyParamBounds(bounds))?;
|
||||
}
|
||||
}
|
||||
&clean::WherePredicate::RegionPredicate { ref lifetime,
|
||||
ref bounds } => {
|
||||
|
@ -167,11 +191,17 @@ impl<'a> fmt::Display for WhereClause<'a> {
|
|||
}
|
||||
}
|
||||
&clean::WherePredicate::EqPredicate { ref lhs, ref rhs } => {
|
||||
write!(f, "{} == {}", lhs, rhs)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#} == {:#}", lhs, rhs)?;
|
||||
} else {
|
||||
write!(f, "{} == {}", lhs, rhs)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
f.write_str("</span>")?;
|
||||
if !f.alternate() {
|
||||
f.write_str("</span>")?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
@ -186,16 +216,28 @@ impl fmt::Display for clean::Lifetime {
|
|||
impl fmt::Display for clean::PolyTrait {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
if !self.lifetimes.is_empty() {
|
||||
f.write_str("for<")?;
|
||||
if f.alternate() {
|
||||
f.write_str("for<")?;
|
||||
} else {
|
||||
f.write_str("for<")?;
|
||||
}
|
||||
for (i, lt) in self.lifetimes.iter().enumerate() {
|
||||
if i > 0 {
|
||||
f.write_str(", ")?;
|
||||
}
|
||||
write!(f, "{}", lt)?;
|
||||
}
|
||||
f.write_str("> ")?;
|
||||
if f.alternate() {
|
||||
f.write_str("> ")?;
|
||||
} else {
|
||||
f.write_str("> ")?;
|
||||
}
|
||||
}
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", self.trait_)
|
||||
} else {
|
||||
write!(f, "{}", self.trait_)
|
||||
}
|
||||
write!(f, "{}", self.trait_)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -210,7 +252,11 @@ impl fmt::Display for clean::TyParamBound {
|
|||
hir::TraitBoundModifier::None => "",
|
||||
hir::TraitBoundModifier::Maybe => "?",
|
||||
};
|
||||
write!(f, "{}{}", modifier_str, *ty)
|
||||
if f.alternate() {
|
||||
write!(f, "{}{:#}", modifier_str, *ty)
|
||||
} else {
|
||||
write!(f, "{}{}", modifier_str, *ty)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -223,30 +269,46 @@ impl fmt::Display for clean::PathParameters {
|
|||
ref lifetimes, ref types, ref bindings
|
||||
} => {
|
||||
if !lifetimes.is_empty() || !types.is_empty() || !bindings.is_empty() {
|
||||
f.write_str("<")?;
|
||||
if f.alternate() {
|
||||
f.write_str("<")?;
|
||||
} else {
|
||||
f.write_str("<")?;
|
||||
}
|
||||
let mut comma = false;
|
||||
for lifetime in lifetimes {
|
||||
if comma {
|
||||
f.write_str(", ")?;
|
||||
f.write_str(", ")?;
|
||||
}
|
||||
comma = true;
|
||||
write!(f, "{}", *lifetime)?;
|
||||
}
|
||||
for ty in types {
|
||||
if comma {
|
||||
f.write_str(", ")?;
|
||||
f.write_str(", ")?;
|
||||
}
|
||||
comma = true;
|
||||
write!(f, "{}", *ty)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", *ty)?;
|
||||
} else {
|
||||
write!(f, "{}", *ty)?;
|
||||
}
|
||||
}
|
||||
for binding in bindings {
|
||||
if comma {
|
||||
f.write_str(", ")?;
|
||||
f.write_str(", ")?;
|
||||
}
|
||||
comma = true;
|
||||
write!(f, "{}", *binding)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", *binding)?;
|
||||
} else {
|
||||
write!(f, "{}", *binding)?;
|
||||
}
|
||||
}
|
||||
if f.alternate() {
|
||||
f.write_str(">")?;
|
||||
} else {
|
||||
f.write_str(">")?;
|
||||
}
|
||||
f.write_str(">")?;
|
||||
}
|
||||
}
|
||||
clean::PathParameters::Parenthesized { ref inputs, ref output } => {
|
||||
|
@ -257,12 +319,19 @@ impl fmt::Display for clean::PathParameters {
|
|||
f.write_str(", ")?;
|
||||
}
|
||||
comma = true;
|
||||
write!(f, "{}", *ty)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", *ty)?;
|
||||
} else {
|
||||
write!(f, "{}", *ty)?;
|
||||
}
|
||||
}
|
||||
f.write_str(")")?;
|
||||
if let Some(ref ty) = *output {
|
||||
f.write_str(" -> ")?;
|
||||
write!(f, "{}", ty)?;
|
||||
if f.alternate() {
|
||||
write!(f, " -> {:#}", ty)?;
|
||||
} else {
|
||||
write!(f, " -> {}", ty)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -273,7 +342,11 @@ impl fmt::Display for clean::PathParameters {
|
|||
impl fmt::Display for clean::PathSegment {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.write_str(&self.name)?;
|
||||
write!(f, "{}", self.params)
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", self.params)
|
||||
} else {
|
||||
write!(f, "{}", self.params)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -287,7 +360,11 @@ impl fmt::Display for clean::Path {
|
|||
if i > 0 {
|
||||
f.write_str("::")?
|
||||
}
|
||||
write!(f, "{}", seg)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", seg)?;
|
||||
} else {
|
||||
write!(f, "{}", seg)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -349,7 +426,7 @@ fn resolved_path(w: &mut fmt::Formatter, did: DefId, path: &clean::Path,
|
|||
match rel_root {
|
||||
Some(mut root) => {
|
||||
for seg in &path.segments[..amt] {
|
||||
if "super" == seg.name || "self" == seg.name {
|
||||
if "super" == seg.name || "self" == seg.name || w.alternate() {
|
||||
write!(w, "{}::", seg.name)?;
|
||||
} else {
|
||||
root.push_str(&seg.name);
|
||||
|
@ -368,7 +445,11 @@ fn resolved_path(w: &mut fmt::Formatter, did: DefId, path: &clean::Path,
|
|||
}
|
||||
}
|
||||
}
|
||||
write!(w, "{}{}", HRef::new(did, &last.name), last.params)?;
|
||||
if w.alternate() {
|
||||
write!(w, "{:#}{:#}", HRef::new(did, &last.name), last.params)?;
|
||||
} else {
|
||||
write!(w, "{}{}", HRef::new(did, &last.name), last.params)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -377,33 +458,35 @@ fn primitive_link(f: &mut fmt::Formatter,
|
|||
name: &str) -> fmt::Result {
|
||||
let m = cache();
|
||||
let mut needs_termination = false;
|
||||
match m.primitive_locations.get(&prim) {
|
||||
Some(&LOCAL_CRATE) => {
|
||||
let len = CURRENT_LOCATION_KEY.with(|s| s.borrow().len());
|
||||
let len = if len == 0 {0} else {len - 1};
|
||||
write!(f, "<a class='primitive' href='{}primitive.{}.html'>",
|
||||
repeat("../").take(len).collect::<String>(),
|
||||
prim.to_url_str())?;
|
||||
needs_termination = true;
|
||||
}
|
||||
Some(&cnum) => {
|
||||
let loc = match m.extern_locations[&cnum] {
|
||||
(ref cname, render::Remote(ref s)) => Some((cname, s.to_string())),
|
||||
(ref cname, render::Local) => {
|
||||
let len = CURRENT_LOCATION_KEY.with(|s| s.borrow().len());
|
||||
Some((cname, repeat("../").take(len).collect::<String>()))
|
||||
}
|
||||
(_, render::Unknown) => None,
|
||||
};
|
||||
if let Some((cname, root)) = loc {
|
||||
write!(f, "<a class='primitive' href='{}{}/primitive.{}.html'>",
|
||||
root,
|
||||
cname,
|
||||
if !f.alternate() {
|
||||
match m.primitive_locations.get(&prim) {
|
||||
Some(&LOCAL_CRATE) => {
|
||||
let len = CURRENT_LOCATION_KEY.with(|s| s.borrow().len());
|
||||
let len = if len == 0 {0} else {len - 1};
|
||||
write!(f, "<a class='primitive' href='{}primitive.{}.html'>",
|
||||
repeat("../").take(len).collect::<String>(),
|
||||
prim.to_url_str())?;
|
||||
needs_termination = true;
|
||||
}
|
||||
Some(&cnum) => {
|
||||
let loc = match m.extern_locations[&cnum] {
|
||||
(ref cname, render::Remote(ref s)) => Some((cname, s.to_string())),
|
||||
(ref cname, render::Local) => {
|
||||
let len = CURRENT_LOCATION_KEY.with(|s| s.borrow().len());
|
||||
Some((cname, repeat("../").take(len).collect::<String>()))
|
||||
}
|
||||
(_, render::Unknown) => None,
|
||||
};
|
||||
if let Some((cname, root)) = loc {
|
||||
write!(f, "<a class='primitive' href='{}{}/primitive.{}.html'>",
|
||||
root,
|
||||
cname,
|
||||
prim.to_url_str())?;
|
||||
needs_termination = true;
|
||||
}
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
write!(f, "{}", name)?;
|
||||
if needs_termination {
|
||||
|
@ -419,7 +502,7 @@ fn tybounds(w: &mut fmt::Formatter,
|
|||
Some(ref params) => {
|
||||
for param in params {
|
||||
write!(w, " + ")?;
|
||||
write!(w, "{}", *param)?;
|
||||
fmt::Display::fmt(param, w)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -436,10 +519,12 @@ impl<'a> HRef<'a> {
|
|||
impl<'a> fmt::Display for HRef<'a> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match href(self.did) {
|
||||
Some((url, shortty, fqp)) => {
|
||||
Some((url, shortty, fqp)) => if !f.alternate() {
|
||||
write!(f, "<a class='{}' href='{}' title='{}'>{}</a>",
|
||||
shortty, url, fqp.join("::"), self.text)
|
||||
}
|
||||
} else {
|
||||
write!(f, "{}", self.text)
|
||||
},
|
||||
_ => write!(f, "{}", self.text),
|
||||
}
|
||||
}
|
||||
|
@ -459,49 +544,68 @@ impl fmt::Display for clean::Type {
|
|||
clean::Infer => write!(f, "_"),
|
||||
clean::Primitive(prim) => primitive_link(f, prim, prim.as_str()),
|
||||
clean::BareFunction(ref decl) => {
|
||||
write!(f, "{}{}fn{}{}",
|
||||
UnsafetySpace(decl.unsafety),
|
||||
AbiSpace(decl.abi),
|
||||
decl.generics,
|
||||
decl.decl)
|
||||
if f.alternate() {
|
||||
write!(f, "{}{}fn{:#}{:#}",
|
||||
UnsafetySpace(decl.unsafety),
|
||||
AbiSpace(decl.abi),
|
||||
decl.generics,
|
||||
decl.decl)
|
||||
} else {
|
||||
write!(f, "{}{}fn{}{}",
|
||||
UnsafetySpace(decl.unsafety),
|
||||
AbiSpace(decl.abi),
|
||||
decl.generics,
|
||||
decl.decl)
|
||||
}
|
||||
}
|
||||
clean::Tuple(ref typs) => {
|
||||
match &typs[..] {
|
||||
&[] => primitive_link(f, PrimitiveType::Tuple, "()"),
|
||||
&[ref one] => {
|
||||
primitive_link(f, PrimitiveType::Tuple, "(")?;
|
||||
write!(f, "{},", one)?;
|
||||
primitive_link(f, PrimitiveType::Tuple, ")")
|
||||
//carry f.alternate() into this display w/o branching manually
|
||||
fmt::Display::fmt(one, f)?;
|
||||
primitive_link(f, PrimitiveType::Tuple, ",)")
|
||||
}
|
||||
many => {
|
||||
primitive_link(f, PrimitiveType::Tuple, "(")?;
|
||||
write!(f, "{}", CommaSep(&many))?;
|
||||
fmt::Display::fmt(&CommaSep(&many), f)?;
|
||||
primitive_link(f, PrimitiveType::Tuple, ")")
|
||||
}
|
||||
}
|
||||
}
|
||||
clean::Vector(ref t) => {
|
||||
primitive_link(f, PrimitiveType::Slice, &format!("["))?;
|
||||
write!(f, "{}", t)?;
|
||||
fmt::Display::fmt(t, f)?;
|
||||
primitive_link(f, PrimitiveType::Slice, &format!("]"))
|
||||
}
|
||||
clean::FixedVector(ref t, ref s) => {
|
||||
primitive_link(f, PrimitiveType::Array, "[")?;
|
||||
write!(f, "{}", t)?;
|
||||
primitive_link(f, PrimitiveType::Array,
|
||||
&format!("; {}]", Escape(s)))
|
||||
fmt::Display::fmt(t, f)?;
|
||||
if f.alternate() {
|
||||
primitive_link(f, PrimitiveType::Array,
|
||||
&format!("; {}]", s))
|
||||
} else {
|
||||
primitive_link(f, PrimitiveType::Array,
|
||||
&format!("; {}]", Escape(s)))
|
||||
}
|
||||
}
|
||||
clean::Never => f.write_str("!"),
|
||||
clean::RawPointer(m, ref t) => {
|
||||
match **t {
|
||||
clean::Generic(_) | clean::ResolvedPath {is_generic: true, ..} => {
|
||||
primitive_link(f, clean::PrimitiveType::RawPointer,
|
||||
&format!("*{}{}", RawMutableSpace(m), t))
|
||||
if f.alternate() {
|
||||
primitive_link(f, clean::PrimitiveType::RawPointer,
|
||||
&format!("*{}{:#}", RawMutableSpace(m), t))
|
||||
} else {
|
||||
primitive_link(f, clean::PrimitiveType::RawPointer,
|
||||
&format!("*{}{}", RawMutableSpace(m), t))
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
primitive_link(f, clean::PrimitiveType::RawPointer,
|
||||
&format!("*{}", RawMutableSpace(m)))?;
|
||||
write!(f, "{}", t)
|
||||
fmt::Display::fmt(t, f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -515,18 +619,33 @@ impl fmt::Display for clean::Type {
|
|||
clean::Vector(ref bt) => { // BorrowedRef{ ... Vector(T) } is &[T]
|
||||
match **bt {
|
||||
clean::Generic(_) =>
|
||||
primitive_link(f, PrimitiveType::Slice,
|
||||
&format!("&{}{}[{}]", lt, m, **bt)),
|
||||
if f.alternate() {
|
||||
primitive_link(f, PrimitiveType::Slice,
|
||||
&format!("&{}{}[{:#}]", lt, m, **bt))
|
||||
} else {
|
||||
primitive_link(f, PrimitiveType::Slice,
|
||||
&format!("&{}{}[{}]", lt, m, **bt))
|
||||
},
|
||||
_ => {
|
||||
primitive_link(f, PrimitiveType::Slice,
|
||||
&format!("&{}{}[", lt, m))?;
|
||||
write!(f, "{}", **bt)?;
|
||||
if f.alternate() {
|
||||
primitive_link(f, PrimitiveType::Slice,
|
||||
&format!("&{}{}[", lt, m))?;
|
||||
write!(f, "{:#}", **bt)?;
|
||||
} else {
|
||||
primitive_link(f, PrimitiveType::Slice,
|
||||
&format!("&{}{}[", lt, m))?;
|
||||
write!(f, "{}", **bt)?;
|
||||
}
|
||||
primitive_link(f, PrimitiveType::Slice, "]")
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
write!(f, "&{}{}{}", lt, m, **ty)
|
||||
if f.alternate() {
|
||||
write!(f, "&{}{}{:#}", lt, m, **ty)
|
||||
} else {
|
||||
write!(f, "&{}{}{}", lt, m, **ty)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -535,7 +654,11 @@ impl fmt::Display for clean::Type {
|
|||
if i != 0 {
|
||||
write!(f, " + ")?;
|
||||
}
|
||||
write!(f, "{}", *bound)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", *bound)?;
|
||||
} else {
|
||||
write!(f, "{}", *bound)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -545,7 +668,11 @@ impl fmt::Display for clean::Type {
|
|||
if i != 0 {
|
||||
write!(f, " + ")?;
|
||||
}
|
||||
write!(f, "{}", *bound)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", *bound)?;
|
||||
} else {
|
||||
write!(f, "{}", *bound)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -564,7 +691,11 @@ impl fmt::Display for clean::Type {
|
|||
ref self_type,
|
||||
trait_: box clean::ResolvedPath { did, ref typarams, .. },
|
||||
} => {
|
||||
write!(f, "{}::", self_type)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}::", self_type)?;
|
||||
} else {
|
||||
write!(f, "{}::", self_type)?;
|
||||
}
|
||||
let path = clean::Path::singleton(name.clone());
|
||||
resolved_path(f, did, &path, false)?;
|
||||
|
||||
|
@ -573,7 +704,11 @@ impl fmt::Display for clean::Type {
|
|||
Ok(())
|
||||
}
|
||||
clean::QPath { ref name, ref self_type, ref trait_ } => {
|
||||
write!(f, "<{} as {}>::{}", self_type, trait_, name)
|
||||
if f.alternate() {
|
||||
write!(f, "<{:#} as {:#}>::{}", self_type, trait_, name)
|
||||
} else {
|
||||
write!(f, "<{} as {}>::{}", self_type, trait_, name)
|
||||
}
|
||||
}
|
||||
clean::Unique(..) => {
|
||||
panic!("should have been cleaned")
|
||||
|
@ -583,24 +718,30 @@ impl fmt::Display for clean::Type {
|
|||
}
|
||||
|
||||
fn fmt_impl(i: &clean::Impl, f: &mut fmt::Formatter, link_trait: bool) -> fmt::Result {
|
||||
write!(f, "impl{} ", i.generics)?;
|
||||
if f.alternate() {
|
||||
write!(f, "impl{:#} ", i.generics)?;
|
||||
} else {
|
||||
write!(f, "impl{} ", i.generics)?;
|
||||
}
|
||||
if let Some(ref ty) = i.trait_ {
|
||||
write!(f, "{}",
|
||||
if i.polarity == Some(clean::ImplPolarity::Negative) { "!" } else { "" })?;
|
||||
if link_trait {
|
||||
write!(f, "{}", *ty)?;
|
||||
fmt::Display::fmt(ty, f)?;
|
||||
} else {
|
||||
match *ty {
|
||||
clean::ResolvedPath{ typarams: None, ref path, is_generic: false, .. } => {
|
||||
let last = path.segments.last().unwrap();
|
||||
write!(f, "{}{}", last.name, last.params)?;
|
||||
fmt::Display::fmt(&last.name, f)?;
|
||||
fmt::Display::fmt(&last.params, f)?;
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
write!(f, " for ")?;
|
||||
}
|
||||
write!(f, "{}{}", i.for_, WhereClause(&i.generics))?;
|
||||
fmt::Display::fmt(&i.for_, f)?;
|
||||
fmt::Display::fmt(&WhereClause(&i.generics), f)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -618,11 +759,15 @@ pub fn fmt_impl_for_trait_page(i: &clean::Impl, f: &mut fmt::Formatter) -> fmt::
|
|||
impl fmt::Display for clean::Arguments {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
for (i, input) in self.values.iter().enumerate() {
|
||||
if i > 0 { write!(f, ", ")?; }
|
||||
if !input.name.is_empty() {
|
||||
write!(f, "{}: ", input.name)?;
|
||||
}
|
||||
write!(f, "{}", input.type_)?;
|
||||
if f.alternate() {
|
||||
write!(f, "{:#}", input.type_)?;
|
||||
} else {
|
||||
write!(f, "{}", input.type_)?;
|
||||
}
|
||||
if i + 1 < self.values.len() { write!(f, ", ")?; }
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -632,6 +777,7 @@ impl fmt::Display for clean::FunctionRetTy {
|
|||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match *self {
|
||||
clean::Return(clean::Tuple(ref tys)) if tys.is_empty() => Ok(()),
|
||||
clean::Return(ref ty) if f.alternate() => write!(f, " -> {:#}", ty),
|
||||
clean::Return(ref ty) => write!(f, " -> {}", ty),
|
||||
clean::DefaultReturn => Ok(()),
|
||||
}
|
||||
|
@ -641,9 +787,17 @@ impl fmt::Display for clean::FunctionRetTy {
|
|||
impl fmt::Display for clean::FnDecl {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
if self.variadic {
|
||||
write!(f, "({args}, ...){arrow}", args = self.inputs, arrow = self.output)
|
||||
if f.alternate() {
|
||||
write!(f, "({args:#}, ...){arrow:#}", args = self.inputs, arrow = self.output)
|
||||
} else {
|
||||
write!(f, "({args}, ...){arrow}", args = self.inputs, arrow = self.output)
|
||||
}
|
||||
} else {
|
||||
write!(f, "({args}){arrow}", args = self.inputs, arrow = self.output)
|
||||
if f.alternate() {
|
||||
write!(f, "({args:#}){arrow:#}", args = self.inputs, arrow = self.output)
|
||||
} else {
|
||||
write!(f, "({args}){arrow}", args = self.inputs, arrow = self.output)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -651,30 +805,89 @@ impl fmt::Display for clean::FnDecl {
|
|||
impl<'a> fmt::Display for Method<'a> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
let decl = self.0;
|
||||
let indent = self.1;
|
||||
let amp = if f.alternate() { "&" } else { "&" };
|
||||
let mut args = String::new();
|
||||
let mut args_plain = String::new();
|
||||
for (i, input) in decl.inputs.values.iter().enumerate() {
|
||||
if i > 0 || !args.is_empty() { args.push_str(", "); }
|
||||
if let Some(selfty) = input.to_self() {
|
||||
match selfty {
|
||||
clean::SelfValue => args.push_str("self"),
|
||||
clean::SelfValue => {
|
||||
args.push_str("self");
|
||||
args_plain.push_str("self");
|
||||
}
|
||||
clean::SelfBorrowed(Some(ref lt), mtbl) => {
|
||||
args.push_str(&format!("&{} {}self", *lt, MutableSpace(mtbl)));
|
||||
args.push_str(&format!("{}{} {}self", amp, *lt, MutableSpace(mtbl)));
|
||||
args_plain.push_str(&format!("&{} {}self", *lt, MutableSpace(mtbl)));
|
||||
}
|
||||
clean::SelfBorrowed(None, mtbl) => {
|
||||
args.push_str(&format!("&{}self", MutableSpace(mtbl)));
|
||||
args.push_str(&format!("{}{}self", amp, MutableSpace(mtbl)));
|
||||
args_plain.push_str(&format!("&{}self", MutableSpace(mtbl)));
|
||||
}
|
||||
clean::SelfExplicit(ref typ) => {
|
||||
args.push_str(&format!("self: {}", *typ));
|
||||
if f.alternate() {
|
||||
args.push_str(&format!("self: {:#}", *typ));
|
||||
} else {
|
||||
args.push_str(&format!("self: {}", *typ));
|
||||
}
|
||||
args_plain.push_str(&format!("self: {:#}", *typ));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if i > 0 {
|
||||
args.push_str("<br> ");
|
||||
args_plain.push_str(" ");
|
||||
}
|
||||
if !input.name.is_empty() {
|
||||
args.push_str(&format!("{}: ", input.name));
|
||||
args_plain.push_str(&format!("{}: ", input.name));
|
||||
}
|
||||
args.push_str(&format!("{}", input.type_));
|
||||
|
||||
if f.alternate() {
|
||||
args.push_str(&format!("{:#}", input.type_));
|
||||
} else {
|
||||
args.push_str(&format!("{}", input.type_));
|
||||
}
|
||||
args_plain.push_str(&format!("{:#}", input.type_));
|
||||
}
|
||||
if i + 1 < decl.inputs.values.len() {
|
||||
args.push_str(",");
|
||||
args_plain.push_str(",");
|
||||
}
|
||||
}
|
||||
write!(f, "({args}){arrow}", args = args, arrow = decl.output)
|
||||
|
||||
if decl.variadic {
|
||||
args.push_str(",<br> ...");
|
||||
args_plain.push_str(", ...");
|
||||
}
|
||||
|
||||
let arrow_plain = format!("{:#}", decl.output);
|
||||
let arrow = if f.alternate() {
|
||||
format!("{:#}", decl.output)
|
||||
} else {
|
||||
format!("{}", decl.output)
|
||||
};
|
||||
|
||||
let mut output: String;
|
||||
let plain: String;
|
||||
if arrow.is_empty() {
|
||||
output = format!("({})", args);
|
||||
plain = format!("{}({})", indent.replace(" ", " "), args_plain);
|
||||
} else {
|
||||
output = format!("({args})<br>{arrow}", args = args, arrow = arrow);
|
||||
plain = format!("{indent}({args}){arrow}",
|
||||
indent = indent.replace(" ", " "),
|
||||
args = args_plain,
|
||||
arrow = arrow_plain);
|
||||
}
|
||||
|
||||
if plain.len() > 80 {
|
||||
let pad = format!("<br>{}", indent);
|
||||
output = output.replace("<br>", &pad);
|
||||
} else {
|
||||
output = output.replace("<br>", "");
|
||||
}
|
||||
write!(f, "{}", output)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -768,7 +981,11 @@ impl fmt::Display for clean::ViewListIdent {
|
|||
|
||||
impl fmt::Display for clean::TypeBinding {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(f, "{}={}", self.name, self.ty)
|
||||
if f.alternate() {
|
||||
write!(f, "{}={:#}", self.name, self.ty)
|
||||
} else {
|
||||
write!(f, "{}={}", self.name, self.ty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -792,10 +1009,11 @@ impl fmt::Display for RawMutableSpace {
|
|||
|
||||
impl fmt::Display for AbiSpace {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
let quot = if f.alternate() { "\"" } else { """ };
|
||||
match self.0 {
|
||||
Abi::Rust => Ok(()),
|
||||
Abi::C => write!(f, "extern "),
|
||||
abi => write!(f, "extern "{}" ", abi.name()),
|
||||
abi => write!(f, "extern {0}{1}{0} ", quot, abi.name()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1967,6 +1967,14 @@ fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
UnstableFeatures::Allow => f.constness,
|
||||
_ => hir::Constness::NotConst
|
||||
};
|
||||
let prefix = format!("{}{}{}{:#}fn {}{:#}",
|
||||
VisSpace(&it.visibility),
|
||||
ConstnessSpace(vis_constness),
|
||||
UnsafetySpace(f.unsafety),
|
||||
AbiSpace(f.abi),
|
||||
it.name.as_ref().unwrap(),
|
||||
f.generics);
|
||||
let indent = repeat(" ").take(prefix.len()).collect::<String>();
|
||||
write!(w, "<pre class='rust fn'>{vis}{constness}{unsafety}{abi}fn \
|
||||
{name}{generics}{decl}{where_clause}</pre>",
|
||||
vis = VisSpace(&it.visibility),
|
||||
|
@ -1976,7 +1984,7 @@ fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
name = it.name.as_ref().unwrap(),
|
||||
generics = f.generics,
|
||||
where_clause = WhereClause(&f.generics),
|
||||
decl = f.decl)?;
|
||||
decl = Method(&f.decl, &indent))?;
|
||||
document(w, cx, it)
|
||||
}
|
||||
|
||||
|
@ -2246,6 +2254,13 @@ fn render_assoc_item(w: &mut fmt::Formatter,
|
|||
UnstableFeatures::Allow => constness,
|
||||
_ => hir::Constness::NotConst
|
||||
};
|
||||
let prefix = format!("{}{}{:#}fn {}{:#}",
|
||||
ConstnessSpace(vis_constness),
|
||||
UnsafetySpace(unsafety),
|
||||
AbiSpace(abi),
|
||||
name,
|
||||
*g);
|
||||
let indent = repeat(" ").take(prefix.len()).collect::<String>();
|
||||
write!(w, "{}{}{}fn <a href='{href}' class='fnname'>{name}</a>\
|
||||
{generics}{decl}{where_clause}",
|
||||
ConstnessSpace(vis_constness),
|
||||
|
@ -2254,7 +2269,7 @@ fn render_assoc_item(w: &mut fmt::Formatter,
|
|||
href = href,
|
||||
name = name,
|
||||
generics = *g,
|
||||
decl = Method(d),
|
||||
decl = Method(d, &indent),
|
||||
where_clause = WhereClause(g))
|
||||
}
|
||||
match item.inner {
|
||||
|
|
21
src/test/rustdoc/line-breaks.rs
Normal file
21
src/test/rustdoc/line-breaks.rs
Normal file
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2016 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.
|
||||
|
||||
#![crate_name = "foo"]
|
||||
|
||||
//@count foo/fn.function_with_a_really_long_name.html //pre/br 2
|
||||
pub fn function_with_a_really_long_name(parameter_one: i32,
|
||||
parameter_two: i32)
|
||||
-> Option<i32> {
|
||||
Some(parameter_one + parameter_two)
|
||||
}
|
||||
|
||||
//@count foo/fn.short_name.html //pre/br 0
|
||||
pub fn short_name(param: i32) -> i32 { param + 1 }
|
Loading…
Add table
Add a link
Reference in a new issue