mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-26 22:26:26 +03:00
Rollup merge of #98256 - GuillaumeGomez:whitespace-where-clause, r=notriddle
Fix whitespace handling after where clause Fixes #97733. You can see the result [here](https://rustdoc.crud.net/imperio/whitespace-where-clause/doc/foo/index.html). r? `@jsha`
This commit is contained in:
@@ -146,6 +146,10 @@ pub(crate) fn is_for_html(&self) -> bool {
|
||||
pub(crate) fn reserve(&mut self, additional: usize) {
|
||||
self.buffer.reserve(additional)
|
||||
}
|
||||
|
||||
pub(crate) fn len(&self) -> usize {
|
||||
self.buffer.len()
|
||||
}
|
||||
}
|
||||
|
||||
fn comma_sep<T: fmt::Display>(
|
||||
|
||||
@@ -62,6 +62,17 @@ struct ItemVars<'a> {
|
||||
src_href: Option<&'a str>,
|
||||
}
|
||||
|
||||
/// Calls `print_where_clause` and returns `true` if a `where` clause was generated.
|
||||
fn print_where_clause_and_check<'a, 'tcx: 'a>(
|
||||
buffer: &mut Buffer,
|
||||
gens: &'a clean::Generics,
|
||||
cx: &'a Context<'tcx>,
|
||||
) -> bool {
|
||||
let len_before = buffer.len();
|
||||
write!(buffer, "{}", print_where_clause(gens, cx, 0, true));
|
||||
len_before != buffer.len()
|
||||
}
|
||||
|
||||
pub(super) fn print_item(
|
||||
cx: &mut Context<'_>,
|
||||
item: &clean::Item,
|
||||
@@ -1152,17 +1163,21 @@ fn item_enum(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, e: &clean::
|
||||
render_attributes_in_pre(w, it, "");
|
||||
write!(
|
||||
w,
|
||||
"{}enum {}{}{}",
|
||||
"{}enum {}{}",
|
||||
it.visibility.print_with_space(it.item_id, cx),
|
||||
it.name.unwrap(),
|
||||
e.generics.print(cx),
|
||||
print_where_clause(&e.generics, cx, 0, true),
|
||||
);
|
||||
if !print_where_clause_and_check(w, &e.generics, cx) {
|
||||
// If there wasn't a `where` clause, we add a whitespace.
|
||||
w.write_str(" ");
|
||||
}
|
||||
|
||||
let variants_stripped = e.has_stripped_entries();
|
||||
if count_variants == 0 && !variants_stripped {
|
||||
w.write_str(" {}");
|
||||
w.write_str("{}");
|
||||
} else {
|
||||
w.write_str(" {\n");
|
||||
w.write_str("{\n");
|
||||
let toggle = should_hide_fields(count_variants);
|
||||
if toggle {
|
||||
toggle_open(w, format_args!("{} variants", count_variants));
|
||||
@@ -1643,13 +1658,21 @@ fn render_union(
|
||||
tab: &str,
|
||||
cx: &Context<'_>,
|
||||
) {
|
||||
write!(w, "{}union {}", it.visibility.print_with_space(it.item_id, cx), it.name.unwrap());
|
||||
if let Some(g) = g {
|
||||
write!(w, "{}", g.print(cx));
|
||||
write!(w, "{}", print_where_clause(g, cx, 0, true));
|
||||
write!(w, "{}union {}", it.visibility.print_with_space(it.item_id, cx), it.name.unwrap(),);
|
||||
|
||||
let where_displayed = g
|
||||
.map(|g| {
|
||||
write!(w, "{}", g.print(cx));
|
||||
print_where_clause_and_check(w, g, cx)
|
||||
})
|
||||
.unwrap_or(false);
|
||||
|
||||
// If there wasn't a `where` clause, we add a whitespace.
|
||||
if !where_displayed {
|
||||
w.write_str(" ");
|
||||
}
|
||||
|
||||
write!(w, " {{\n{}", tab);
|
||||
write!(w, "{{\n{}", tab);
|
||||
let count_fields =
|
||||
fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count();
|
||||
let toggle = should_hide_fields(count_fields);
|
||||
@@ -1701,10 +1724,14 @@ fn render_struct(
|
||||
}
|
||||
match ty {
|
||||
CtorKind::Fictive => {
|
||||
if let Some(g) = g {
|
||||
write!(w, "{}", print_where_clause(g, cx, 0, true),)
|
||||
let where_diplayed = g.map(|g| print_where_clause_and_check(w, g, cx)).unwrap_or(false);
|
||||
|
||||
// If there wasn't a `where` clause, we add a whitespace.
|
||||
if !where_diplayed {
|
||||
w.write_str(" {");
|
||||
} else {
|
||||
w.write_str("{");
|
||||
}
|
||||
w.write_str(" {");
|
||||
let count_fields =
|
||||
fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count();
|
||||
let has_visible_fields = count_fields > 0;
|
||||
@@ -1759,7 +1786,7 @@ fn render_struct(
|
||||
}
|
||||
w.write_str(")");
|
||||
if let Some(g) = g {
|
||||
write!(w, "{}", print_where_clause(g, cx, 0, false),)
|
||||
write!(w, "{}", print_where_clause(g, cx, 0, false));
|
||||
}
|
||||
// We only want a ";" when we are displaying a tuple struct, not a variant tuple struct.
|
||||
if structhead {
|
||||
@@ -1769,7 +1796,7 @@ fn render_struct(
|
||||
CtorKind::Const => {
|
||||
// Needed for PhantomData.
|
||||
if let Some(g) = g {
|
||||
write!(w, "{}", print_where_clause(g, cx, 0, false),)
|
||||
write!(w, "{}", print_where_clause(g, cx, 0, false));
|
||||
}
|
||||
w.write_str(";");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<div class="docblock item-decl"><pre class="rust enum"><code>pub enum Cow<'a, B: ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a> <span class="where fmt-newline">where<br />    B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>>, </span>{
|
||||
Borrowed(<a class="primitive" href="{{channel}}/std/primitive.reference.html">&'a </a>B),
|
||||
Whatever(<a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a>),
|
||||
}</code></pre></div>
|
||||
@@ -0,0 +1,4 @@
|
||||
<div class="docblock item-decl"><pre class="rust enum"><code>pub enum Cow2<'a, B: ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + 'a> {
|
||||
Borrowed(<a class="primitive" href="{{channel}}/std/primitive.reference.html">&'a </a>B),
|
||||
Whatever(<a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a>),
|
||||
}</code></pre></div>
|
||||
@@ -0,0 +1,77 @@
|
||||
// This test ensures there is no whitespace before the first brace of
|
||||
// trait, enum, struct and union items when they have a where clause.
|
||||
|
||||
#![crate_name = "foo"]
|
||||
|
||||
// @has 'foo/trait.ToOwned.html'
|
||||
// @snapshot trait - '//*[@class="docblock item-decl"]'
|
||||
pub trait ToOwned<T>
|
||||
where T: Clone
|
||||
{
|
||||
type Owned;
|
||||
fn to_owned(&self) -> Self::Owned;
|
||||
fn whatever(&self) -> T;
|
||||
}
|
||||
|
||||
// @has 'foo/trait.ToOwned2.html'
|
||||
// @snapshot trait2 - '//*[@class="docblock item-decl"]'
|
||||
// There should be a whitespace before `{` in this case!
|
||||
pub trait ToOwned2<T: Clone> {
|
||||
type Owned;
|
||||
fn to_owned(&self) -> Self::Owned;
|
||||
fn whatever(&self) -> T;
|
||||
}
|
||||
|
||||
// @has 'foo/enum.Cow.html'
|
||||
// @snapshot enum - '//*[@class="docblock item-decl"]'
|
||||
pub enum Cow<'a, B: ?Sized + 'a>
|
||||
where
|
||||
B: ToOwned<Clone>,
|
||||
{
|
||||
Borrowed(&'a B),
|
||||
Whatever(u32),
|
||||
}
|
||||
|
||||
// @has 'foo/enum.Cow2.html'
|
||||
// @snapshot enum2 - '//*[@class="docblock item-decl"]'
|
||||
// There should be a whitespace before `{` in this case!
|
||||
pub enum Cow2<'a, B: ?Sized + ToOwned<Clone> + 'a> {
|
||||
Borrowed(&'a B),
|
||||
Whatever(u32),
|
||||
}
|
||||
|
||||
// @has 'foo/struct.Struct.html'
|
||||
// @snapshot struct - '//*[@class="docblock item-decl"]'
|
||||
pub struct Struct<'a, B: ?Sized + 'a>
|
||||
where
|
||||
B: ToOwned<Clone>,
|
||||
{
|
||||
pub a: &'a B,
|
||||
pub b: u32,
|
||||
}
|
||||
|
||||
// @has 'foo/struct.Struct2.html'
|
||||
// @snapshot struct2 - '//*[@class="docblock item-decl"]'
|
||||
// There should be a whitespace before `{` in this case!
|
||||
pub struct Struct2<'a, B: ?Sized + ToOwned<Clone> + 'a> {
|
||||
pub a: &'a B,
|
||||
pub b: u32,
|
||||
}
|
||||
|
||||
// @has 'foo/union.Union.html'
|
||||
// @snapshot union - '//*[@class="docblock item-decl"]'
|
||||
pub union Union<'a, B: ?Sized + 'a>
|
||||
where
|
||||
B: ToOwned<Clone>,
|
||||
{
|
||||
a: &'a B,
|
||||
b: u32,
|
||||
}
|
||||
|
||||
// @has 'foo/union.Union2.html'
|
||||
// @snapshot union2 - '//*[@class="docblock item-decl"]'
|
||||
// There should be a whitespace before `{` in this case!
|
||||
pub union Union2<'a, B: ?Sized + ToOwned<Clone> + 'a> {
|
||||
a: &'a B,
|
||||
b: u32,
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
<div class="docblock item-decl"><pre class="rust struct"><code>pub struct Struct<'a, B: ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a> <span class="where fmt-newline">where<br />    B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>>, </span>{
|
||||
pub a: <a class="primitive" href="{{channel}}/std/primitive.reference.html">&'a </a>B,
|
||||
pub b: <a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a>,
|
||||
}</code></pre></div>
|
||||
@@ -0,0 +1,4 @@
|
||||
<div class="docblock item-decl"><pre class="rust struct"><code>pub struct Struct2<'a, B: ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + 'a> {
|
||||
pub a: <a class="primitive" href="{{channel}}/std/primitive.reference.html">&'a </a>B,
|
||||
pub b: <a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a>,
|
||||
}</code></pre></div>
|
||||
@@ -0,0 +1,6 @@
|
||||
<div class="docblock item-decl"><pre class="rust trait"><code>pub trait ToOwned<T> <span class="where fmt-newline">where<br />    T: <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>, </span>{
|
||||
type <a href="#associatedtype.Owned" class="associatedtype">Owned</a>;
|
||||
|
||||
fn <a href="#tymethod.to_owned" class="fnname">to_owned</a>(&self) -> Self::<a class="associatedtype" href="trait.ToOwned.html#associatedtype.Owned" title="type foo::ToOwned::Owned">Owned</a>;
|
||||
<span class="item-spacer" /> fn <a href="#tymethod.whatever" class="fnname">whatever</a>(&self) -> T;
|
||||
}</code></pre></div>
|
||||
@@ -0,0 +1,6 @@
|
||||
<div class="docblock item-decl"><pre class="rust trait"><code>pub trait ToOwned2<T: <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> {
|
||||
type <a href="#associatedtype.Owned" class="associatedtype">Owned</a>;
|
||||
|
||||
fn <a href="#tymethod.to_owned" class="fnname">to_owned</a>(&self) -> Self::<a class="associatedtype" href="trait.ToOwned2.html#associatedtype.Owned" title="type foo::ToOwned2::Owned">Owned</a>;
|
||||
<span class="item-spacer" /> fn <a href="#tymethod.whatever" class="fnname">whatever</a>(&self) -> T;
|
||||
}</code></pre></div>
|
||||
@@ -0,0 +1,3 @@
|
||||
<div class="docblock item-decl"><pre class="rust union"><code>pub union Union<'a, B: ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a> <span class="where fmt-newline">where<br />    B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>>, </span>{
|
||||
/* private fields */
|
||||
}</code></pre></div>
|
||||
@@ -0,0 +1,3 @@
|
||||
<div class="docblock item-decl"><pre class="rust union"><code>pub union Union2<'a, B: ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + 'a> {
|
||||
/* private fields */
|
||||
}</code></pre></div>
|
||||
Reference in New Issue
Block a user