Skip to content

Commit 42f28d3

Browse files
author
QuietMisdreavus
committed
rustdoc: apply proper indent when where clauses aren't on their own line
1 parent c6ab685 commit 42f28d3

File tree

2 files changed

+96
-30
lines changed

2 files changed

+96
-30
lines changed

src/librustdoc/html/format.rs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub struct MutableSpace(pub clean::Mutability);
5050
#[derive(Copy, Clone)]
5151
pub struct RawMutableSpace(pub clean::Mutability);
5252
/// Wrapper struct for emitting a where clause from Generics.
53-
pub struct WhereClause<'a>(pub &'a clean::Generics);
53+
pub struct WhereClause<'a>(pub &'a clean::Generics, pub String);
5454
/// Wrapper struct for emitting type parameter bounds.
5555
pub struct TyParamBounds<'a>(pub &'a [clean::TyParamBound]);
5656
/// Wrapper struct for emitting a comma-separated list of items
@@ -157,7 +157,7 @@ impl fmt::Display for clean::Generics {
157157

158158
impl<'a> fmt::Display for WhereClause<'a> {
159159
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
160-
let &WhereClause(gens) = self;
160+
let &WhereClause(gens, ref pad) = self;
161161
if gens.where_predicates.is_empty() {
162162
return Ok(());
163163
}
@@ -207,8 +207,8 @@ impl<'a> fmt::Display for WhereClause<'a> {
207207
if !f.alternate() {
208208
clause.push_str("</span>");
209209
let plain = format!("{:#}", self);
210-
if plain.len() > 80 {
211-
let padding = repeat("&nbsp;").take(8).collect::<String>();
210+
if plain.len() + pad.len() > 80 {
211+
let padding = repeat("&nbsp;").take(pad.len() + 6).collect::<String>();
212212
clause = clause.replace("<br>", &format!("<br>{}", padding));
213213
} else {
214214
clause = clause.replace("<br>", " ");
@@ -730,30 +730,44 @@ impl fmt::Display for clean::Type {
730730
}
731731

732732
fn fmt_impl(i: &clean::Impl, f: &mut fmt::Formatter, link_trait: bool) -> fmt::Result {
733+
let mut plain = String::new();
734+
733735
if f.alternate() {
734736
write!(f, "impl{:#} ", i.generics)?;
735737
} else {
736738
write!(f, "impl{} ", i.generics)?;
737739
}
740+
plain.push_str(&format!("impl{:#} ", i.generics));
741+
738742
if let Some(ref ty) = i.trait_ {
739-
write!(f, "{}",
740-
if i.polarity == Some(clean::ImplPolarity::Negative) { "!" } else { "" })?;
743+
if i.polarity == Some(clean::ImplPolarity::Negative) {
744+
write!(f, "!")?;
745+
plain.push_str("!");
746+
}
747+
741748
if link_trait {
742749
fmt::Display::fmt(ty, f)?;
750+
plain.push_str(&format!("{:#}", ty));
743751
} else {
744752
match *ty {
745753
clean::ResolvedPath{ typarams: None, ref path, is_generic: false, .. } => {
746754
let last = path.segments.last().unwrap();
747755
fmt::Display::fmt(&last.name, f)?;
748756
fmt::Display::fmt(&last.params, f)?;
757+
plain.push_str(&format!("{:#}{:#}", last.name, last.params));
749758
}
750759
_ => unreachable!(),
751760
}
752761
}
753762
write!(f, " for ")?;
763+
plain.push_str(" for ");
754764
}
765+
755766
fmt::Display::fmt(&i.for_, f)?;
756-
fmt::Display::fmt(&WhereClause(&i.generics), f)?;
767+
plain.push_str(&format!("{:#}", i.for_));
768+
769+
let pad = repeat(" ").take(plain.len() + 1).collect::<String>();
770+
fmt::Display::fmt(&WhereClause(&i.generics, pad), f)?;
757771
Ok(())
758772
}
759773

@@ -899,7 +913,11 @@ impl<'a> fmt::Display for Method<'a> {
899913
} else {
900914
output = output.replace("<br>", "");
901915
}
902-
write!(f, "{}", output)
916+
if f.alternate() {
917+
write!(f, "{}", output.replace("<br>", "\n"))
918+
} else {
919+
write!(f, "{}", output)
920+
}
903921
}
904922
}
905923

src/librustdoc/html/render.rs

Lines changed: 70 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1983,33 +1983,43 @@ fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
19831983
abi = AbiSpace(f.abi),
19841984
name = it.name.as_ref().unwrap(),
19851985
generics = f.generics,
1986-
where_clause = WhereClause(&f.generics),
1986+
where_clause = WhereClause(&f.generics, " ".to_string()),
19871987
decl = Method(&f.decl, &indent))?;
19881988
document(w, cx, it)
19891989
}
19901990

19911991
fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
19921992
t: &clean::Trait) -> fmt::Result {
19931993
let mut bounds = String::new();
1994+
let mut bounds_plain = String::new();
19941995
if !t.bounds.is_empty() {
19951996
if !bounds.is_empty() {
19961997
bounds.push(' ');
1998+
bounds_plain.push(' ');
19971999
}
19982000
bounds.push_str(": ");
2001+
bounds_plain.push_str(": ");
19992002
for (i, p) in t.bounds.iter().enumerate() {
2000-
if i > 0 { bounds.push_str(" + "); }
2003+
if i > 0 {
2004+
bounds.push_str(" + ");
2005+
bounds_plain.push_str(" + ");
2006+
}
20012007
bounds.push_str(&format!("{}", *p));
2008+
bounds_plain.push_str(&format!("{:#}", *p));
20022009
}
20032010
}
20042011

2012+
// Where clauses in traits are indented nine spaces, per rustdoc.css
2013+
let indent = " ".to_string();
2014+
20052015
// Output the trait definition
20062016
write!(w, "<pre class='rust trait'>{}{}trait {}{}{}{} ",
20072017
VisSpace(&it.visibility),
20082018
UnsafetySpace(t.unsafety),
20092019
it.name.as_ref().unwrap(),
20102020
t.generics,
20112021
bounds,
2012-
WhereClause(&t.generics))?;
2022+
WhereClause(&t.generics, indent))?;
20132023

20142024
let types = t.items.iter().filter(|m| m.is_associated_type()).collect::<Vec<_>>();
20152025
let consts = t.items.iter().filter(|m| m.is_associated_const()).collect::<Vec<_>>();
@@ -2023,31 +2033,31 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
20232033
write!(w, "{{\n")?;
20242034
for t in &types {
20252035
write!(w, " ")?;
2026-
render_assoc_item(w, t, AssocItemLink::Anchor(None))?;
2036+
render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait)?;
20272037
write!(w, ";\n")?;
20282038
}
20292039
if !types.is_empty() && !consts.is_empty() {
20302040
w.write_str("\n")?;
20312041
}
20322042
for t in &consts {
20332043
write!(w, " ")?;
2034-
render_assoc_item(w, t, AssocItemLink::Anchor(None))?;
2044+
render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait)?;
20352045
write!(w, ";\n")?;
20362046
}
20372047
if !consts.is_empty() && !required.is_empty() {
20382048
w.write_str("\n")?;
20392049
}
20402050
for m in &required {
20412051
write!(w, " ")?;
2042-
render_assoc_item(w, m, AssocItemLink::Anchor(None))?;
2052+
render_assoc_item(w, m, AssocItemLink::Anchor(None), ItemType::Trait)?;
20432053
write!(w, ";\n")?;
20442054
}
20452055
if !required.is_empty() && !provided.is_empty() {
20462056
w.write_str("\n")?;
20472057
}
20482058
for m in &provided {
20492059
write!(w, " ")?;
2050-
render_assoc_item(w, m, AssocItemLink::Anchor(None))?;
2060+
render_assoc_item(w, m, AssocItemLink::Anchor(None), ItemType::Trait)?;
20512061
write!(w, " {{ ... }}\n")?;
20522062
}
20532063
write!(w, "}}")?;
@@ -2068,7 +2078,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
20682078
id = id,
20692079
stab = m.stability_class(),
20702080
ns_id = ns_id)?;
2071-
render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)))?;
2081+
render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl)?;
20722082
write!(w, "</code>")?;
20732083
render_stability_since(w, m, t)?;
20742084
write!(w, "</span></h3>")?;
@@ -2222,15 +2232,17 @@ fn render_stability_since(w: &mut fmt::Formatter,
22222232

22232233
fn render_assoc_item(w: &mut fmt::Formatter,
22242234
item: &clean::Item,
2225-
link: AssocItemLink) -> fmt::Result {
2235+
link: AssocItemLink,
2236+
parent: ItemType) -> fmt::Result {
22262237
fn method(w: &mut fmt::Formatter,
22272238
meth: &clean::Item,
22282239
unsafety: hir::Unsafety,
22292240
constness: hir::Constness,
22302241
abi: abi::Abi,
22312242
g: &clean::Generics,
22322243
d: &clean::FnDecl,
2233-
link: AssocItemLink)
2244+
link: AssocItemLink,
2245+
parent: ItemType)
22342246
-> fmt::Result {
22352247
let name = meth.name.as_ref().unwrap();
22362248
let anchor = format!("#{}.{}", meth.type_(), name);
@@ -2260,7 +2272,17 @@ fn render_assoc_item(w: &mut fmt::Formatter,
22602272
AbiSpace(abi),
22612273
name,
22622274
*g);
2263-
let indent = repeat("&nbsp;").take(prefix.len()).collect::<String>();
2275+
let mut indent = repeat("&nbsp;").take(prefix.len()).collect::<String>();
2276+
let where_indent = if parent == ItemType::Trait {
2277+
indent += "&nbsp;&nbsp;&nbsp;&nbsp;";
2278+
" ".to_string()
2279+
} else if parent == ItemType::Impl {
2280+
" ".to_string()
2281+
} else {
2282+
let prefix = prefix + &format!("{:#}", Method(d, &indent));
2283+
let prefix = prefix.lines().last().unwrap();
2284+
repeat(" ").take(prefix.len() + 1).collect::<String>()
2285+
};
22642286
write!(w, "{}{}{}fn <a href='{href}' class='fnname'>{name}</a>\
22652287
{generics}{decl}{where_clause}",
22662288
ConstnessSpace(vis_constness),
@@ -2270,18 +2292,17 @@ fn render_assoc_item(w: &mut fmt::Formatter,
22702292
name = name,
22712293
generics = *g,
22722294
decl = Method(d, &indent),
2273-
where_clause = WhereClause(g))
2295+
where_clause = WhereClause(g, where_indent))
22742296
}
22752297
match item.inner {
22762298
clean::StrippedItem(..) => Ok(()),
22772299
clean::TyMethodItem(ref m) => {
22782300
method(w, item, m.unsafety, hir::Constness::NotConst,
2279-
m.abi, &m.generics, &m.decl, link)
2301+
m.abi, &m.generics, &m.decl, link, parent)
22802302
}
22812303
clean::MethodItem(ref m) => {
22822304
method(w, item, m.unsafety, m.constness,
2283-
m.abi, &m.generics, &m.decl,
2284-
link)
2305+
m.abi, &m.generics, &m.decl, link, parent)
22852306
}
22862307
clean::AssociatedConstItem(ref ty, ref default) => {
22872308
assoc_const(w, item, ty, default.as_ref(), link)
@@ -2378,11 +2399,15 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
23782399
e: &clean::Enum) -> fmt::Result {
23792400
write!(w, "<pre class='rust enum'>")?;
23802401
render_attributes(w, it)?;
2402+
let padding = format!("{}enum {}{:#} ",
2403+
VisSpace(&it.visibility),
2404+
it.name.as_ref().unwrap(),
2405+
e.generics);
23812406
write!(w, "{}enum {}{}{}",
23822407
VisSpace(&it.visibility),
23832408
it.name.as_ref().unwrap(),
23842409
e.generics,
2385-
WhereClause(&e.generics))?;
2410+
WhereClause(&e.generics, padding))?;
23862411
if e.variants.is_empty() && !e.variants_stripped {
23872412
write!(w, " {{}}")?;
23882413
} else {
@@ -2517,17 +2542,24 @@ fn render_struct(w: &mut fmt::Formatter, it: &clean::Item,
25172542
fields: &[clean::Item],
25182543
tab: &str,
25192544
structhead: bool) -> fmt::Result {
2545+
let mut plain = String::new();
25202546
write!(w, "{}{}{}",
25212547
VisSpace(&it.visibility),
25222548
if structhead {"struct "} else {""},
25232549
it.name.as_ref().unwrap())?;
2550+
plain.push_str(&format!("{}{}{}",
2551+
VisSpace(&it.visibility),
2552+
if structhead {"struct "} else {""},
2553+
it.name.as_ref().unwrap()));
25242554
if let Some(g) = g {
2555+
plain.push_str(&format!("{:#}", g));
25252556
write!(w, "{}", g)?
25262557
}
25272558
match ty {
25282559
doctree::Plain => {
25292560
if let Some(g) = g {
2530-
write!(w, "{}", WhereClause(g))?
2561+
let pad = repeat(" ").take(plain.len() + 1).collect::<String>();
2562+
write!(w, "{}", WhereClause(g, pad))?
25312563
}
25322564
let mut has_visible_fields = false;
25332565
write!(w, " {{")?;
@@ -2556,30 +2588,37 @@ fn render_struct(w: &mut fmt::Formatter, it: &clean::Item,
25562588
}
25572589
doctree::Tuple => {
25582590
write!(w, "(")?;
2591+
plain.push_str("(");
25592592
for (i, field) in fields.iter().enumerate() {
25602593
if i > 0 {
25612594
write!(w, ", ")?;
2595+
plain.push_str(", ");
25622596
}
25632597
match field.inner {
25642598
clean::StrippedItem(box clean::StructFieldItem(..)) => {
2599+
plain.push_str("_");
25652600
write!(w, "_")?
25662601
}
25672602
clean::StructFieldItem(ref ty) => {
2603+
plain.push_str(&format!("{}{:#}", VisSpace(&field.visibility), *ty));
25682604
write!(w, "{}{}", VisSpace(&field.visibility), *ty)?
25692605
}
25702606
_ => unreachable!()
25712607
}
25722608
}
25732609
write!(w, ")")?;
2610+
plain.push_str(")");
25742611
if let Some(g) = g {
2575-
write!(w, "{}", WhereClause(g))?
2612+
let pad = repeat(" ").take(plain.len() + 1).collect::<String>();
2613+
write!(w, "{}", WhereClause(g, pad))?
25762614
}
25772615
write!(w, ";")?;
25782616
}
25792617
doctree::Unit => {
25802618
// Needed for PhantomData.
25812619
if let Some(g) = g {
2582-
write!(w, "{}", WhereClause(g))?
2620+
let pad = repeat(" ").take(plain.len() + 1).collect::<String>();
2621+
write!(w, "{}", WhereClause(g, pad))?
25832622
}
25842623
write!(w, ";")?;
25852624
}
@@ -2592,13 +2631,20 @@ fn render_union(w: &mut fmt::Formatter, it: &clean::Item,
25922631
fields: &[clean::Item],
25932632
tab: &str,
25942633
structhead: bool) -> fmt::Result {
2634+
let mut plain = String::new();
25952635
write!(w, "{}{}{}",
25962636
VisSpace(&it.visibility),
25972637
if structhead {"union "} else {""},
25982638
it.name.as_ref().unwrap())?;
2639+
plain.push_str(&format!("{}{}{}",
2640+
VisSpace(&it.visibility),
2641+
if structhead {"union "} else {""},
2642+
it.name.as_ref().unwrap()));
25992643
if let Some(g) = g {
26002644
write!(w, "{}", g)?;
2601-
write!(w, "{}", WhereClause(g))?;
2645+
plain.push_str(&format!("{:#}", g));
2646+
let pad = repeat(" ").take(plain.len() + 1).collect::<String>();
2647+
write!(w, "{}", WhereClause(g, pad))?;
26022648
}
26032649

26042650
write!(w, " {{\n{}", tab)?;
@@ -2789,7 +2835,7 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
27892835
write!(w, "<h4 id='{}' class='{}'>", id, item_type)?;
27902836
write!(w, "<span id='{}' class='invisible'>", ns_id)?;
27912837
write!(w, "<code>")?;
2792-
render_assoc_item(w, item, link.anchor(&id))?;
2838+
render_assoc_item(w, item, link.anchor(&id), ItemType::Impl)?;
27932839
write!(w, "</code>")?;
27942840
render_stability_since_raw(w, item.stable_since(), outer_version)?;
27952841
write!(w, "</span></h4>\n")?;
@@ -2899,10 +2945,12 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
28992945

29002946
fn item_typedef(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
29012947
t: &clean::Typedef) -> fmt::Result {
2948+
let indent = format!("type {}{:#} ", it.name.as_ref().unwrap(), t.generics);
2949+
let indent = repeat(" ").take(indent.len()).collect::<String>();
29022950
write!(w, "<pre class='rust typedef'>type {}{}{where_clause} = {type_};</pre>",
29032951
it.name.as_ref().unwrap(),
29042952
t.generics,
2905-
where_clause = WhereClause(&t.generics),
2953+
where_clause = WhereClause(&t.generics, indent),
29062954
type_ = t.type_)?;
29072955

29082956
document(w, cx, it)

0 commit comments

Comments
 (0)