#[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);
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(())
}
if i > 0 {
f.write_str(" + ")?;
}
- write!(f, "{}", *bound)?;
+ fmt::Display::fmt(bound, f)?;
}
Ok(())
}
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(())
}
}
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(", ")?;
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 } => {
}
}
&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(())
}
}
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_)
}
}
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)
+ }
}
}
}
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 } => {
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)?;
+ }
}
}
}
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)
+ }
}
}
if i > 0 {
f.write_str("::")?
}
- write!(f, "{}", seg)?;
+ if f.alternate() {
+ write!(f, "{:#}", seg)?;
+ } else {
+ write!(f, "{}", seg)?;
+ }
}
Ok(())
}
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);
}
}
}
- 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(())
}
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 {
Some(ref params) => {
for param in params {
write!(w, " + ")?;
- write!(w, "{}", *param)?;
+ fmt::Display::fmt(param, w)?;
}
Ok(())
}
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),
}
}
clean::Infer => write!(f, "_"),
clean::Primitive(prim) => primitive_link(f, prim, prim.to_string()),
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)?;
+ //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)
}
}
}
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() {
+ write!(f, "{:#}", **bt)?;
+ } else {
+ 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)
+ }
}
}
}
if i != 0 {
write!(f, " + ")?;
}
- write!(f, "{}", *bound)?;
+ if f.alternate() {
+ write!(f, "{:#}", *bound)?;
+ } else {
+ write!(f, "{}", *bound)?;
+ }
}
Ok(())
}
if i != 0 {
write!(f, " + ")?;
}
- write!(f, "{}", *bound)?;
+ if f.alternate() {
+ write!(f, "{:#}", *bound)?;
+ } else {
+ write!(f, "{}", *bound)?;
+ }
}
Ok(())
}
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)?;
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")
}
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(())
}
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, ",")?; }
}
if !self.values.is_empty() {
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(()),
}
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)
+ }
}
}
}
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 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)));
+ let arg = format!("{}{} {}self", amp, *lt, MutableSpace(mtbl));
+ args.push_str(&arg);
+ args_plain.push_str(&arg);
}
clean::SelfBorrowed(None, mtbl) => {
- args.push_str(&format!("&{}self", MutableSpace(mtbl)));
+ let arg = format!("{}{}self", amp, MutableSpace(mtbl));
+ args.push_str(&arg);
+ args_plain.push_str(&arg);
}
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 {
- args.push_str("\n ");
+ if i > 0 {
+ args.push_str("\n ");
+ args_plain.push_str("\n ");
+ }
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(",");
}
- 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);
+ }
+
+ if plain.replace("\n", "").len() > 80 {
+ let pad = format!("\n{}", indent);
+ output = output.replace("\n", &pad);
+ } else {
+ output = output.replace("\n", "");
}
- write!(f, "({args}){arrow}", args = args, arrow = decl.output)
+ write!(f, "{}", output)
}
}
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)
+ }
}
}
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()),
}
}
}