diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs
index 4fbbaf0f2e183..df7835214ebb6 100644
--- a/src/librustdoc/html/format.rs
+++ b/src/librustdoc/html/format.rs
@@ -49,8 +49,11 @@ pub struct AbiSpace(pub Abi);
pub struct Function<'a> {
/// The declaration to emit.
pub decl: &'a clean::FnDecl,
- /// The length of the function's "name", used to determine line-wrapping.
- pub name_len: usize,
+ /// The length of the function header and name. In other words, the number of characters in the
+ /// function declaration up to but not including the parentheses.
+ ///
+ /// Used to determine line-wrapping.
+ pub header_len: usize,
/// The number of spaces to indent each successive line with, if line-wrapping is necessary.
pub indent: usize,
/// Whether the function is async or not.
@@ -675,7 +678,11 @@ fn fmt_type(t: &clean::Type, f: &mut fmt::Formatter, use_absolute: bool) -> fmt:
}
}
clean::ImplTrait(ref bounds) => {
- write!(f, "impl {}", GenericBounds(bounds))
+ if f.alternate() {
+ write!(f, "impl {:#}", GenericBounds(bounds))
+ } else {
+ write!(f, "impl {}", GenericBounds(bounds))
+ }
}
clean::QPath { ref name, ref self_type, ref trait_ } => {
let should_show_cast = match *trait_ {
@@ -844,7 +851,7 @@ impl fmt::Display for clean::FnDecl {
impl<'a> fmt::Display for Function<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let &Function { decl, name_len, indent, asyncness } = self;
+ let &Function { decl, header_len, indent, asyncness } = self;
let amp = if f.alternate() { "&" } else { "&" };
let mut args = String::new();
let mut args_plain = String::new();
@@ -899,6 +906,8 @@ impl<'a> fmt::Display for Function<'a> {
}
}
+ let mut args_plain = format!("({})", args_plain);
+
if decl.variadic {
args.push_str(",
...");
args_plain.push_str(", ...");
@@ -917,13 +926,8 @@ impl<'a> fmt::Display for Function<'a> {
output.to_string()
};
- let pad = " ".repeat(name_len);
- let plain = format!("{pad}({args}){arrow}",
- pad = pad,
- args = args_plain,
- arrow = arrow_plain);
-
- let output = if plain.len() > 80 {
+ let declaration_len = header_len + args_plain.len() + arrow_plain.len();
+ let output = if declaration_len > 80 {
let full_pad = format!("
{}", " ".repeat(indent + 4));
let close_pad = format!("
{}", " ".repeat(indent));
format!("({args}{close}){arrow}",
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 744c4ae65c6e0..d037154272db6 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -2984,14 +2984,16 @@ fn item_static(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
f: &clean::Function) -> fmt::Result {
- let name_len = format!("{}{}{}{}{:#}fn {}{:#}",
- VisSpace(&it.visibility),
- ConstnessSpace(f.header.constness),
- UnsafetySpace(f.header.unsafety),
- AsyncSpace(f.header.asyncness),
- AbiSpace(f.header.abi),
- it.name.as_ref().unwrap(),
- f.generics).len();
+ let header_len = format!(
+ "{}{}{}{}{:#}fn {}{:#}",
+ VisSpace(&it.visibility),
+ ConstnessSpace(f.header.constness),
+ UnsafetySpace(f.header.unsafety),
+ AsyncSpace(f.header.asyncness),
+ AbiSpace(f.header.abi),
+ it.name.as_ref().unwrap(),
+ f.generics
+ ).len();
write!(w, "{}
", render_spotlight_traits(it)?)?; render_attributes(w, it)?; write!(w, @@ -3007,7 +3009,7 @@ fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, where_clause = WhereClause { gens: &f.generics, indent: 0, end_newline: true }, decl = Function { decl: &f.decl, - name_len, + header_len, indent: 0, asyncness: f.header.asyncness, })?; @@ -3422,16 +3424,18 @@ fn render_assoc_item(w: &mut fmt::Formatter, href(did).map(|p| format!("{}#{}.{}", p.0, ty, name)).unwrap_or(anchor) } }; - let mut head_len = format!("{}{}{}{}{:#}fn {}{:#}", - VisSpace(&meth.visibility), - ConstnessSpace(header.constness), - UnsafetySpace(header.unsafety), - AsyncSpace(header.asyncness), - AbiSpace(header.abi), - name, - *g).len(); + let mut header_len = format!( + "{}{}{}{}{:#}fn {}{:#}", + VisSpace(&meth.visibility), + ConstnessSpace(header.constness), + UnsafetySpace(header.unsafety), + AsyncSpace(header.asyncness), + AbiSpace(header.abi), + name, + *g + ).len(); let (indent, end_newline) = if parent == ItemType::Trait { - head_len += 4; + header_len += 4; (4, false) } else { (0, true) @@ -3449,7 +3453,7 @@ fn render_assoc_item(w: &mut fmt::Formatter, generics = *g, decl = Function { decl: d, - name_len: head_len, + header_len, indent, asyncness: header.asyncness, }, diff --git a/src/test/rustdoc/wrapping.rs b/src/test/rustdoc/wrapping.rs new file mode 100644 index 0000000000000..8d8221bcdf293 --- /dev/null +++ b/src/test/rustdoc/wrapping.rs @@ -0,0 +1,5 @@ +use std::fmt::Debug; + +// @has 'wrapping/fn.foo.html' '//pre[@class="rust fn"]' 'pub fn foo() -> impl Debug' +// @count - '//pre[@class="rust fn"]/br' 0 +pub fn foo() -> impl Debug {}