1
Fork 0

rustdoc: format struct methods like rustfmt

* ignore signatures 80 characters or shorter
* otherwise, put arguments and return arrow on their own line, indented
  to the opening parenthesis

in doing this, most of a plain-text output has been written for rustdoc,
accessible through "alternate" Display printing: "{:#}"
This commit is contained in:
QuietMisdreavus 2016-09-26 16:02:21 -05:00
parent fccfc5392a
commit 2a274e720f
2 changed files with 320 additions and 100 deletions

View file

@ -42,7 +42,7 @@ pub struct UnsafetySpace(pub hir::Unsafety);
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct ConstnessSpace(pub hir::Constness); pub struct ConstnessSpace(pub hir::Constness);
/// Wrapper struct for properly emitting a method declaration. /// 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 /// Similar to VisSpace, but used for mutability
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct MutableSpace(pub clean::Mutability); 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 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for (i, item) in self.0.iter().enumerate() { for (i, item) in self.0.iter().enumerate() {
if i != 0 { write!(f, ", ")?; } if i != 0 { write!(f, ", ")?; }
write!(f, "{}", item)?; fmt::Display::fmt(item, f)?;
} }
Ok(()) Ok(())
} }
@ -97,7 +97,7 @@ impl<'a> fmt::Display for TyParamBounds<'a> {
if i > 0 { if i > 0 {
f.write_str(" + ")?; f.write_str(" + ")?;
} }
write!(f, "{}", *bound)?; fmt::Display::fmt(bound, f)?;
} }
Ok(()) Ok(())
} }
@ -106,35 +106,51 @@ impl<'a> fmt::Display for TyParamBounds<'a> {
impl fmt::Display for clean::Generics { impl fmt::Display for clean::Generics {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.lifetimes.is_empty() && self.type_params.is_empty() { return Ok(()) } if self.lifetimes.is_empty() && self.type_params.is_empty() { return Ok(()) }
f.write_str("&lt;")?; if f.alternate() {
f.write_str("<")?;
} else {
f.write_str("&lt;")?;
}
for (i, life) in self.lifetimes.iter().enumerate() { for (i, life) in self.lifetimes.iter().enumerate() {
if i > 0 { if i > 0 {
f.write_str(",&nbsp;")?; f.write_str(", ")?;
} }
write!(f, "{}", *life)?; write!(f, "{}", *life)?;
} }
if !self.type_params.is_empty() { if !self.type_params.is_empty() {
if !self.lifetimes.is_empty() { if !self.lifetimes.is_empty() {
f.write_str(",&nbsp;")?; f.write_str(", ")?;
} }
for (i, tp) in self.type_params.iter().enumerate() { for (i, tp) in self.type_params.iter().enumerate() {
if i > 0 { if i > 0 {
f.write_str(",&nbsp;")? f.write_str(", ")?
} }
f.write_str(&tp.name)?; f.write_str(&tp.name)?;
if !tp.bounds.is_empty() { if !tp.bounds.is_empty() {
write!(f, ":&nbsp;{}", TyParamBounds(&tp.bounds))?; if f.alternate() {
write!(f, ": {:#}", TyParamBounds(&tp.bounds))?;
} else {
write!(f, ":&nbsp;{}", TyParamBounds(&tp.bounds))?;
}
} }
if let Some(ref ty) = tp.default { if let Some(ref ty) = tp.default {
write!(f, "&nbsp;=&nbsp;{}", ty)?; if f.alternate() {
write!(f, " = {:#}", ty)?;
} else {
write!(f, "&nbsp;=&nbsp;{}", ty)?;
}
}; };
} }
} }
f.write_str("&gt;")?; if f.alternate() {
f.write_str(">")?;
} else {
f.write_str("&gt;")?;
}
Ok(()) Ok(())
} }
} }
@ -145,7 +161,11 @@ impl<'a> fmt::Display for WhereClause<'a> {
if gens.where_predicates.is_empty() { if gens.where_predicates.is_empty() {
return Ok(()); 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() { for (i, pred) in gens.where_predicates.iter().enumerate() {
if i > 0 { if i > 0 {
f.write_str(", ")?; f.write_str(", ")?;
@ -153,7 +173,11 @@ impl<'a> fmt::Display for WhereClause<'a> {
match pred { match pred {
&clean::WherePredicate::BoundPredicate { ref ty, ref bounds } => { &clean::WherePredicate::BoundPredicate { ref ty, ref bounds } => {
let bounds = 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, &clean::WherePredicate::RegionPredicate { ref lifetime,
ref bounds } => { ref bounds } => {
@ -167,11 +191,17 @@ impl<'a> fmt::Display for WhereClause<'a> {
} }
} }
&clean::WherePredicate::EqPredicate { ref lhs, ref rhs } => { &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(()) Ok(())
} }
} }
@ -186,16 +216,28 @@ impl fmt::Display for clean::Lifetime {
impl fmt::Display for clean::PolyTrait { impl fmt::Display for clean::PolyTrait {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if !self.lifetimes.is_empty() { if !self.lifetimes.is_empty() {
f.write_str("for&lt;")?; if f.alternate() {
f.write_str("for<")?;
} else {
f.write_str("for&lt;")?;
}
for (i, lt) in self.lifetimes.iter().enumerate() { for (i, lt) in self.lifetimes.iter().enumerate() {
if i > 0 { if i > 0 {
f.write_str(", ")?; f.write_str(", ")?;
} }
write!(f, "{}", lt)?; write!(f, "{}", lt)?;
} }
f.write_str("&gt; ")?; if f.alternate() {
f.write_str("> ")?;
} else {
f.write_str("&gt; ")?;
}
}
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::None => "",
hir::TraitBoundModifier::Maybe => "?", 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 ref lifetimes, ref types, ref bindings
} => { } => {
if !lifetimes.is_empty() || !types.is_empty() || !bindings.is_empty() { if !lifetimes.is_empty() || !types.is_empty() || !bindings.is_empty() {
f.write_str("&lt;")?; if f.alternate() {
f.write_str("<")?;
} else {
f.write_str("&lt;")?;
}
let mut comma = false; let mut comma = false;
for lifetime in lifetimes { for lifetime in lifetimes {
if comma { if comma {
f.write_str(",&nbsp;")?; f.write_str(", ")?;
} }
comma = true; comma = true;
write!(f, "{}", *lifetime)?; write!(f, "{}", *lifetime)?;
} }
for ty in types { for ty in types {
if comma { if comma {
f.write_str(",&nbsp;")?; f.write_str(", ")?;
} }
comma = true; comma = true;
write!(f, "{}", *ty)?; if f.alternate() {
write!(f, "{:#}", *ty)?;
} else {
write!(f, "{}", *ty)?;
}
} }
for binding in bindings { for binding in bindings {
if comma { if comma {
f.write_str(",&nbsp;")?; f.write_str(", ")?;
} }
comma = true; 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("&gt;")?;
} }
f.write_str("&gt;")?;
} }
} }
clean::PathParameters::Parenthesized { ref inputs, ref output } => { clean::PathParameters::Parenthesized { ref inputs, ref output } => {
@ -257,12 +319,19 @@ impl fmt::Display for clean::PathParameters {
f.write_str(", ")?; f.write_str(", ")?;
} }
comma = true; comma = true;
write!(f, "{}", *ty)?; if f.alternate() {
write!(f, "{:#}", *ty)?;
} else {
write!(f, "{}", *ty)?;
}
} }
f.write_str(")")?; f.write_str(")")?;
if let Some(ref ty) = *output { if let Some(ref ty) = *output {
f.write_str(" -&gt; ")?; if f.alternate() {
write!(f, "{}", ty)?; write!(f, " -> {:#}", ty)?;
} else {
write!(f, " -&gt; {}", ty)?;
}
} }
} }
} }
@ -273,7 +342,11 @@ impl fmt::Display for clean::PathParameters {
impl fmt::Display for clean::PathSegment { impl fmt::Display for clean::PathSegment {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(&self.name)?; 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 { if i > 0 {
f.write_str("::")? f.write_str("::")?
} }
write!(f, "{}", seg)?; if f.alternate() {
write!(f, "{:#}", seg)?;
} else {
write!(f, "{}", seg)?;
}
} }
Ok(()) Ok(())
} }
@ -349,7 +426,7 @@ fn resolved_path(w: &mut fmt::Formatter, did: DefId, path: &clean::Path,
match rel_root { match rel_root {
Some(mut root) => { Some(mut root) => {
for seg in &path.segments[..amt] { 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)?; write!(w, "{}::", seg.name)?;
} else { } else {
root.push_str(&seg.name); 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(()) Ok(())
} }
@ -377,33 +458,35 @@ fn primitive_link(f: &mut fmt::Formatter,
name: &str) -> fmt::Result { name: &str) -> fmt::Result {
let m = cache(); let m = cache();
let mut needs_termination = false; let mut needs_termination = false;
match m.primitive_locations.get(&prim) { if !f.alternate() {
Some(&LOCAL_CRATE) => { match m.primitive_locations.get(&prim) {
let len = CURRENT_LOCATION_KEY.with(|s| s.borrow().len()); Some(&LOCAL_CRATE) => {
let len = if len == 0 {0} else {len - 1}; let len = CURRENT_LOCATION_KEY.with(|s| s.borrow().len());
write!(f, "<a class='primitive' href='{}primitive.{}.html'>", let len = if len == 0 {0} else {len - 1};
repeat("../").take(len).collect::<String>(), write!(f, "<a class='primitive' href='{}primitive.{}.html'>",
prim.to_url_str())?; repeat("../").take(len).collect::<String>(),
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())?; prim.to_url_str())?;
needs_termination = true; 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)?; write!(f, "{}", name)?;
if needs_termination { if needs_termination {
@ -419,7 +502,7 @@ fn tybounds(w: &mut fmt::Formatter,
Some(ref params) => { Some(ref params) => {
for param in params { for param in params {
write!(w, " + ")?; write!(w, " + ")?;
write!(w, "{}", *param)?; fmt::Display::fmt(param, w)?;
} }
Ok(()) Ok(())
} }
@ -436,10 +519,12 @@ impl<'a> HRef<'a> {
impl<'a> fmt::Display for HRef<'a> { impl<'a> fmt::Display for HRef<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match href(self.did) { match href(self.did) {
Some((url, shortty, fqp)) => { Some((url, shortty, fqp)) => if !f.alternate() {
write!(f, "<a class='{}' href='{}' title='{}'>{}</a>", write!(f, "<a class='{}' href='{}' title='{}'>{}</a>",
shortty, url, fqp.join("::"), self.text) shortty, url, fqp.join("::"), self.text)
} } else {
write!(f, "{}", self.text)
},
_ => write!(f, "{}", self.text), _ => write!(f, "{}", self.text),
} }
} }
@ -459,49 +544,68 @@ impl fmt::Display for clean::Type {
clean::Infer => write!(f, "_"), clean::Infer => write!(f, "_"),
clean::Primitive(prim) => primitive_link(f, prim, prim.to_string()), clean::Primitive(prim) => primitive_link(f, prim, prim.to_string()),
clean::BareFunction(ref decl) => { clean::BareFunction(ref decl) => {
write!(f, "{}{}fn{}{}", if f.alternate() {
UnsafetySpace(decl.unsafety), write!(f, "{}{}fn{:#}{:#}",
AbiSpace(decl.abi), UnsafetySpace(decl.unsafety),
decl.generics, AbiSpace(decl.abi),
decl.decl) decl.generics,
decl.decl)
} else {
write!(f, "{}{}fn{}{}",
UnsafetySpace(decl.unsafety),
AbiSpace(decl.abi),
decl.generics,
decl.decl)
}
} }
clean::Tuple(ref typs) => { clean::Tuple(ref typs) => {
match &typs[..] { match &typs[..] {
&[] => primitive_link(f, PrimitiveType::Tuple, "()"), &[] => primitive_link(f, PrimitiveType::Tuple, "()"),
&[ref one] => { &[ref one] => {
primitive_link(f, PrimitiveType::Tuple, "(")?; primitive_link(f, PrimitiveType::Tuple, "(")?;
write!(f, "{},", one)?; //carry f.alternate() into this display w/o branching manually
fmt::Display::fmt(one, f)?;
primitive_link(f, PrimitiveType::Tuple, ")") primitive_link(f, PrimitiveType::Tuple, ")")
} }
many => { many => {
primitive_link(f, PrimitiveType::Tuple, "(")?; primitive_link(f, PrimitiveType::Tuple, "(")?;
write!(f, "{}", CommaSep(&many))?; fmt::Display::fmt(&CommaSep(&many), f)?;
primitive_link(f, PrimitiveType::Tuple, ")") primitive_link(f, PrimitiveType::Tuple, ")")
} }
} }
} }
clean::Vector(ref t) => { clean::Vector(ref t) => {
primitive_link(f, PrimitiveType::Slice, &format!("["))?; primitive_link(f, PrimitiveType::Slice, &format!("["))?;
write!(f, "{}", t)?; fmt::Display::fmt(t, f)?;
primitive_link(f, PrimitiveType::Slice, &format!("]")) primitive_link(f, PrimitiveType::Slice, &format!("]"))
} }
clean::FixedVector(ref t, ref s) => { clean::FixedVector(ref t, ref s) => {
primitive_link(f, PrimitiveType::Array, "[")?; primitive_link(f, PrimitiveType::Array, "[")?;
write!(f, "{}", t)?; fmt::Display::fmt(t, f)?;
primitive_link(f, PrimitiveType::Array, if f.alternate() {
&format!("; {}]", Escape(s))) primitive_link(f, PrimitiveType::Array,
&format!("; {}]", s))
} else {
primitive_link(f, PrimitiveType::Array,
&format!("; {}]", Escape(s)))
}
} }
clean::Never => f.write_str("!"), clean::Never => f.write_str("!"),
clean::RawPointer(m, ref t) => { clean::RawPointer(m, ref t) => {
match **t { match **t {
clean::Generic(_) | clean::ResolvedPath {is_generic: true, ..} => { clean::Generic(_) | clean::ResolvedPath {is_generic: true, ..} => {
primitive_link(f, clean::PrimitiveType::RawPointer, if f.alternate() {
&format!("*{}{}", RawMutableSpace(m), t)) 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, primitive_link(f, clean::PrimitiveType::RawPointer,
&format!("*{}", RawMutableSpace(m)))?; &format!("*{}", RawMutableSpace(m)))?;
write!(f, "{}", t) fmt::Display::fmt(t, f)
} }
} }
} }
@ -515,18 +619,31 @@ impl fmt::Display for clean::Type {
clean::Vector(ref bt) => { // BorrowedRef{ ... Vector(T) } is &[T] clean::Vector(ref bt) => { // BorrowedRef{ ... Vector(T) } is &[T]
match **bt { match **bt {
clean::Generic(_) => clean::Generic(_) =>
primitive_link(f, PrimitiveType::Slice, if f.alternate() {
&format!("&amp;{}{}[{}]", lt, m, **bt)), primitive_link(f, PrimitiveType::Slice,
&format!("&amp;{}{}[{:#}]", lt, m, **bt))
} else {
primitive_link(f, PrimitiveType::Slice,
&format!("&amp;{}{}[{}]", lt, m, **bt))
},
_ => { _ => {
primitive_link(f, PrimitiveType::Slice, primitive_link(f, PrimitiveType::Slice,
&format!("&amp;{}{}[", lt, m))?; &format!("&amp;{}{}[", lt, m))?;
write!(f, "{}", **bt)?; if f.alternate() {
write!(f, "{:#}", **bt)?;
} else {
write!(f, "{}", **bt)?;
}
primitive_link(f, PrimitiveType::Slice, "]") primitive_link(f, PrimitiveType::Slice, "]")
} }
} }
} }
_ => { _ => {
write!(f, "&amp;{}{}{}", lt, m, **ty) if f.alternate() {
write!(f, "&amp;{}{}{:#}", lt, m, **ty)
} else {
write!(f, "&amp;{}{}{}", lt, m, **ty)
}
} }
} }
} }
@ -535,7 +652,11 @@ impl fmt::Display for clean::Type {
if i != 0 { if i != 0 {
write!(f, " + ")?; write!(f, " + ")?;
} }
write!(f, "{}", *bound)?; if f.alternate() {
write!(f, "{:#}", *bound)?;
} else {
write!(f, "{}", *bound)?;
}
} }
Ok(()) Ok(())
} }
@ -545,7 +666,11 @@ impl fmt::Display for clean::Type {
if i != 0 { if i != 0 {
write!(f, " + ")?; write!(f, " + ")?;
} }
write!(f, "{}", *bound)?; if f.alternate() {
write!(f, "{:#}", *bound)?;
} else {
write!(f, "{}", *bound)?;
}
} }
Ok(()) Ok(())
} }
@ -564,7 +689,11 @@ impl fmt::Display for clean::Type {
ref self_type, ref self_type,
trait_: box clean::ResolvedPath { did, ref typarams, .. }, 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()); let path = clean::Path::singleton(name.clone());
resolved_path(f, did, &path, false)?; resolved_path(f, did, &path, false)?;
@ -573,7 +702,11 @@ impl fmt::Display for clean::Type {
Ok(()) Ok(())
} }
clean::QPath { ref name, ref self_type, ref trait_ } => { clean::QPath { ref name, ref self_type, ref trait_ } => {
write!(f, "&lt;{} as {}&gt;::{}", self_type, trait_, name) if f.alternate() {
write!(f, "<{:#} as {:#}>::{}", self_type, trait_, name)
} else {
write!(f, "&lt;{} as {}&gt;::{}", self_type, trait_, name)
}
} }
clean::Unique(..) => { clean::Unique(..) => {
panic!("should have been cleaned") panic!("should have been cleaned")
@ -583,24 +716,30 @@ impl fmt::Display for clean::Type {
} }
fn fmt_impl(i: &clean::Impl, f: &mut fmt::Formatter, link_trait: bool) -> fmt::Result { 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_ { if let Some(ref ty) = i.trait_ {
write!(f, "{}", write!(f, "{}",
if i.polarity == Some(clean::ImplPolarity::Negative) { "!" } else { "" })?; if i.polarity == Some(clean::ImplPolarity::Negative) { "!" } else { "" })?;
if link_trait { if link_trait {
write!(f, "{}", *ty)?; fmt::Display::fmt(ty, f)?;
} else { } else {
match *ty { match *ty {
clean::ResolvedPath{ typarams: None, ref path, is_generic: false, .. } => { clean::ResolvedPath{ typarams: None, ref path, is_generic: false, .. } => {
let last = path.segments.last().unwrap(); 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!(), _ => unreachable!(),
} }
} }
write!(f, " for ")?; write!(f, " for ")?;
} }
write!(f, "{}{}", i.for_, WhereClause(&i.generics))?; fmt::Display::fmt(&i.for_, f)?;
fmt::Display::fmt(&WhereClause(&i.generics), f)?;
Ok(()) Ok(())
} }
@ -622,7 +761,11 @@ impl fmt::Display for clean::Arguments {
if !input.name.is_empty() { if !input.name.is_empty() {
write!(f, "{}: ", input.name)?; 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, ",")?; } if i + 1 < self.values.len() { write!(f, ",")?; }
} }
if !self.values.is_empty() { if !self.values.is_empty() {
@ -636,6 +779,7 @@ impl fmt::Display for clean::FunctionRetTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self { match *self {
clean::Return(clean::Tuple(ref tys)) if tys.is_empty() => Ok(()), 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, " -&gt; {}", ty), clean::Return(ref ty) => write!(f, " -&gt; {}", ty),
clean::DefaultReturn => Ok(()), clean::DefaultReturn => Ok(()),
} }
@ -645,9 +789,17 @@ impl fmt::Display for clean::FunctionRetTy {
impl fmt::Display for clean::FnDecl { impl fmt::Display for clean::FnDecl {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.variadic { 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 { } 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)
}
} }
} }
} }
@ -655,34 +807,82 @@ impl fmt::Display for clean::FnDecl {
impl<'a> fmt::Display for Method<'a> { impl<'a> fmt::Display for Method<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let decl = self.0; let decl = self.0;
let indent = self.1;
let amp = if f.alternate() { "&" } else { "&amp;" };
let mut args = String::new(); let mut args = String::new();
let mut args_plain = String::new();
for (i, input) in decl.inputs.values.iter().enumerate() { for (i, input) in decl.inputs.values.iter().enumerate() {
if let Some(selfty) = input.to_self() { if let Some(selfty) = input.to_self() {
match selfty { 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) => { clean::SelfBorrowed(Some(ref lt), mtbl) => {
args.push_str(&format!("&amp;{} {}self", *lt, MutableSpace(mtbl))); let arg = format!("{}{} {}self", amp, *lt, MutableSpace(mtbl));
args.push_str(&arg);
args_plain.push_str(&arg);
} }
clean::SelfBorrowed(None, mtbl) => { clean::SelfBorrowed(None, mtbl) => {
args.push_str(&format!("&amp;{}self", MutableSpace(mtbl))); let arg = format!("{}{}self", amp, MutableSpace(mtbl));
args.push_str(&arg);
args_plain.push_str(&arg);
} }
clean::SelfExplicit(ref typ) => { 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 { } else {
args.push_str("\n "); if i > 0 {
args.push_str("\n ");
args_plain.push_str("\n ");
}
if !input.name.is_empty() { if !input.name.is_empty() {
args.push_str(&format!("{}: ", input.name)); 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(",");
} }
if i + 1 < decl.inputs.values.len() { args.push_str(","); }
} }
if let Some(None) = decl.inputs.values.iter().last().map(|val| val.to_self()) {
args.push_str("\n"); 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!("({})", args_plain);
} else {
output = format!("({args})\n{arrow}", args = args, arrow = arrow);
plain = format!("({args})\n{arrow}", args = args_plain, arrow = arrow_plain);
} }
write!(f, "({args}){arrow}", args = args, arrow = decl.output)
if plain.replace("\n", "").len() > 80 {
let pad = format!("\n{}", indent);
output = output.replace("\n", &pad);
} else {
output = output.replace("\n", "");
}
write!(f, "{}", output)
} }
} }
@ -776,7 +976,11 @@ impl fmt::Display for clean::ViewListIdent {
impl fmt::Display for clean::TypeBinding { impl fmt::Display for clean::TypeBinding {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 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)
}
} }
} }
@ -800,10 +1004,11 @@ impl fmt::Display for RawMutableSpace {
impl fmt::Display for AbiSpace { impl fmt::Display for AbiSpace {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let quot = if f.alternate() { "\"" } else { "&quot;" };
match self.0 { match self.0 {
Abi::Rust => Ok(()), Abi::Rust => Ok(()),
Abi::C => write!(f, "extern "), Abi::C => write!(f, "extern "),
abi => write!(f, "extern &quot;{}&quot; ", abi.name()), abi => write!(f, "extern {0}{1}{0} ", quot, abi.name()),
} }
} }
} }

View file

@ -1975,6 +1975,14 @@ fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
UnstableFeatures::Allow => f.constness, UnstableFeatures::Allow => f.constness,
_ => hir::Constness::NotConst _ => hir::Constness::NotConst
}; };
let prefix = format!("{vis}{constness}{unsafety}{abi:#}fn {name}{generics:#}",
vis = VisSpace(&it.visibility),
constness = ConstnessSpace(vis_constness),
unsafety = UnsafetySpace(f.unsafety),
abi = AbiSpace(f.abi),
name = it.name.as_ref().unwrap(),
generics = f.generics)?;
let indent = repeat("&nbsp;").take(prefix.len()).collect::<String>();
write!(w, "<pre class='rust fn'>{vis}{constness}{unsafety}{abi}fn \ write!(w, "<pre class='rust fn'>{vis}{constness}{unsafety}{abi}fn \
{name}{generics}{decl}{where_clause}</pre>", {name}{generics}{decl}{where_clause}</pre>",
vis = VisSpace(&it.visibility), vis = VisSpace(&it.visibility),
@ -2254,6 +2262,13 @@ fn render_assoc_item(w: &mut fmt::Formatter,
UnstableFeatures::Allow => constness, UnstableFeatures::Allow => constness,
_ => hir::Constness::NotConst _ => hir::Constness::NotConst
}; };
let prefix = format!("{}{}{:#}fn {}{:#}",
ConstnessSpace(vis_constness),
UnsafetySpace(unsafety),
AbiSpace(abi),
name,
*g);
let indent = repeat("&nbsp;").take(prefix.len()).collect::<String>();
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}",
ConstnessSpace(vis_constness), ConstnessSpace(vis_constness),
@ -2262,7 +2277,7 @@ fn render_assoc_item(w: &mut fmt::Formatter,
href = href, href = href,
name = name, name = name,
generics = *g, generics = *g,
decl = Method(d), decl = Method(d, &indent),
where_clause = WhereClause(g)) where_clause = WhereClause(g))
} }
match item.inner { match item.inner {