diff options
| author | QuietMisdreavus <grey@quietmisdreavus.net> | 2017-04-04 10:31:57 -0500 |
|---|---|---|
| committer | QuietMisdreavus <grey@quietmisdreavus.net> | 2017-04-04 10:31:57 -0500 |
| commit | 6bc3d65948c3606c29beb8da359d2a45a36e5c15 (patch) | |
| tree | fed96c85b21bd6ec21d44c89b15a731b755c8add | |
| parent | 3643d8165909c4a7959ed6cf9f3d1bd9cf3661b4 (diff) | |
rustdoc: properly indent fn signatures in traits
| -rw-r--r-- | src/librustdoc/html/format.rs | 28 | ||||
| -rw-r--r-- | src/librustdoc/html/render.rs | 50 |
2 files changed, 48 insertions, 30 deletions
diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index fd069ed7e07..9e45ccaff32 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -41,8 +41,6 @@ pub struct UnsafetySpace(pub hir::Unsafety); /// with a space after it. #[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 usize); /// Similar to VisSpace, but used for mutability #[derive(Copy, Clone)] pub struct MutableSpace(pub clean::Mutability); @@ -55,10 +53,23 @@ pub struct TyParamBounds<'a>(pub &'a [clean::TyParamBound]); pub struct CommaSep<'a, T: 'a>(pub &'a [T]); pub struct AbiSpace(pub Abi); +/// Wrapper struct for properly emitting a method declaration. +pub struct Method<'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 number of spaces to indent each successive line with, if line-wrapping is necessary. + pub indent: usize, +} + /// Wrapper struct for emitting a where clause from Generics. pub struct WhereClause<'a>{ + /// The Generics from which to emit a where clause. pub gens: &'a clean::Generics, + /// The number of spaces to indent each line with. pub indent: usize, + /// Whether the where clause needs to add a comma and newline after the last bound. pub end_newline: bool, } @@ -936,8 +947,7 @@ 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 &Method { decl, name_len, indent } = self; let amp = if f.alternate() { "&" } else { "&" }; let mut args = String::new(); let mut args_plain = String::new(); @@ -1004,15 +1014,19 @@ impl<'a> fmt::Display for Method<'a> { format!("{}", decl.output) }; - let pad = repeat(" ").take(indent).collect::<String>(); + let pad = repeat(" ").take(name_len).collect::<String>(); let plain = format!("{pad}({args}){arrow}", pad = pad, args = args_plain, arrow = arrow_plain); let output = if plain.len() > 80 { - let pad = "<br> "; - format!("({args}<br>){arrow}", args = args.replace("<br>", pad), arrow = arrow) + let full_pad = format!("<br>{}", repeat(" ").take(indent + 4).collect::<String>()); + let close_pad = format!("<br>{}", repeat(" ").take(indent).collect::<String>()); + format!("({args}{close}){arrow}", + args = args.replace("<br>", &full_pad), + close = close_pad, + arrow = arrow) } else { format!("({args}){arrow}", args = args.replace("<br>", ""), arrow = arrow) }; diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 4eb228ce68f..be69f6b8ec2 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1995,13 +1995,13 @@ fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, UnstableFeatures::Allow => f.constness, _ => hir::Constness::NotConst }; - let indent = format!("{}{}{}{:#}fn {}{:#}", - VisSpace(&it.visibility), - ConstnessSpace(vis_constness), - UnsafetySpace(f.unsafety), - AbiSpace(f.abi), - it.name.as_ref().unwrap(), - f.generics).len(); + let name_len = format!("{}{}{}{:#}fn {}{:#}", + VisSpace(&it.visibility), + ConstnessSpace(vis_constness), + UnsafetySpace(f.unsafety), + AbiSpace(f.abi), + it.name.as_ref().unwrap(), + f.generics).len(); write!(w, "<pre class='rust fn'>")?; render_attributes(w, it)?; write!(w, "{vis}{constness}{unsafety}{abi}fn \ @@ -2013,7 +2013,11 @@ fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, name = it.name.as_ref().unwrap(), generics = f.generics, where_clause = WhereClause { gens: &f.generics, indent: 0, end_newline: true }, - decl = Method(&f.decl, indent))?; + decl = Method { + decl: &f.decl, + name_len: name_len, + indent: 0, + })?; document(w, cx, it) } @@ -2326,21 +2330,17 @@ 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 mut indent = prefix.len(); - let (where_indent, end_newline) = if parent == ItemType::Trait { - indent += 4; + let mut head_len = format!("{}{}{:#}fn {}{:#}", + ConstnessSpace(vis_constness), + UnsafetySpace(unsafety), + AbiSpace(abi), + name, + *g).len(); + let (indent, end_newline) = if parent == ItemType::Trait { + head_len += 4; (4, false) - } else if parent == ItemType::Impl { - (0, true) } else { - let prefix = prefix + &format!("{:#}", Method(d, indent)); - (prefix.lines().last().unwrap().len() + 1, true) + (0, true) }; write!(w, "{}{}{}fn <a href='{href}' class='fnname'>{name}</a>\ {generics}{decl}{where_clause}", @@ -2350,10 +2350,14 @@ fn render_assoc_item(w: &mut fmt::Formatter, href = href, name = name, generics = *g, - decl = Method(d, indent), + decl = Method { + decl: d, + name_len: head_len, + indent: indent, + }, where_clause = WhereClause { gens: g, - indent: where_indent, + indent: indent, end_newline: end_newline, }) } |
