Rollup merge of #102439 - fmease:rustdoc-simplify-cross-crate-trait-bounds, r=GuillaumeGomez
rustdoc: re-sugar more cross-crate trait bounds
Previously, we would only ever re-sugar cross-crate predicates like `Type: Trait, <Type as Trait>::Name == Rhs` to `Type: Trait<Name = Rhs>` if the `Type` was a generic parameter like `Self` or `T`. With this PR, `Type` can be any type.
Most notably, this means that we now re-sugar predicates involving associated types (where `Type` is of the form `Self::Name`) which are then picked up by the pre-existing logic that re-sugars them into bounds. As a result of that, the associated type `IntoIter` of `std`'s `IntoIterator` trait (re-exported from `core`) is no longer rendered as:
```rust
type IntoIter: Iterator
where
<Self::IntoIter as Iterator>::Item == Self::Item;
```
but as one would expect: `type IntoIter: Iterator<Item = Self::Item>;`.
Cross-crate closure bounds like `F: Fn(i32) -> bool` are now also rendered properly (previously, the return type (`Self::Output`) would not be rendered and we would show the underlying equality predicate).
Fixes #77763.
Fixes #84579.
Fixes #102142.
`@rustbot` label T-rustdoc A-cross-crate-reexports
r? rustdoc
This commit is contained in:
commit
2e7e17a84a
6 changed files with 107 additions and 23 deletions
|
|
@ -0,0 +1 @@
|
|||
<h4 class="code-header">type <a href="#associatedtype.Out0" class="associatedtype">Out0</a>: <a class="trait" href="../assoc_item_trait_bounds_with_bindings/trait.Support.html" title="trait assoc_item_trait_bounds_with_bindings::Support">Support</a><Item = <a class="primitive" href="{{channel}}/std/primitive.unit.html">()</a>></h4>
|
||||
|
|
@ -0,0 +1 @@
|
|||
<h4 class="code-header">type <a href="#associatedtype.Out9" class="associatedtype">Out9</a>: <a class="trait" href="{{channel}}/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(<a class="primitive" href="{{channel}}/std/primitive.i32.html">i32</a>) -> <a class="primitive" href="{{channel}}/std/primitive.bool.html">bool</a> + <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a></h4>
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
// Regression test for issues #77763, #84579 and #102142.
|
||||
#![crate_name = "main"]
|
||||
|
||||
// aux-build:assoc_item_trait_bounds_with_bindings.rs
|
||||
// build-aux-docs
|
||||
// ignore-cross-compile
|
||||
extern crate assoc_item_trait_bounds_with_bindings as aux;
|
||||
|
||||
// FIXME(fmease): Don't render an incorrect `T: ?Sized` where-clause for parameters
|
||||
// of GATs like `Main::Out{2,4}`. Add a snapshot test once it's fixed.
|
||||
// FIXME(fmease): Print the `for<>` parameter list in the bounds of
|
||||
// `Main::Out{6,11,12}`.
|
||||
|
||||
// @has main/trait.Main.html
|
||||
// @has - '//*[@id="associatedtype.Out0"]' 'type Out0: Support<Item = ()>'
|
||||
// @has - '//*[@id="associatedtype.Out1"]' 'type Out1: Support<Item = Self::Item>'
|
||||
// @has - '//*[@id="associatedtype.Out2"]' 'type Out2<T>: Support<Item = T>'
|
||||
// @has - '//*[@id="associatedtype.Out3"]' 'type Out3: Support<Produce<()> = bool>'
|
||||
// @has - '//*[@id="associatedtype.Out4"]' 'type Out4<T>: Support<Produce<T> = T>'
|
||||
// @has - '//*[@id="associatedtype.Out5"]' "type Out5: Support<Output<'static> = &'static ()>"
|
||||
// @has - '//*[@id="associatedtype.Out6"]' "type Out6: Support<Output<'a> = &'a ()>"
|
||||
// @has - '//*[@id="associatedtype.Out7"]' "type Out7: Support<Item = String, Produce<i32> = u32> + Unrelated"
|
||||
// @has - '//*[@id="associatedtype.Out8"]' "type Out8: Unrelated + Protocol<i16, Q1 = u128, Q0 = ()>"
|
||||
// @has - '//*[@id="associatedtype.Out9"]' "type Out9: FnMut(i32) -> bool + Clone"
|
||||
// @has - '//*[@id="associatedtype.Out10"]' "type Out10<'q>: Support<Output<'q> = ()>"
|
||||
// @has - '//*[@id="associatedtype.Out11"]' "type Out11: Helper<A<'s> = &'s (), B<'r> = ()>"
|
||||
// @has - '//*[@id="associatedtype.Out12"]' "type Out12: Helper<B<'w> = Cow<'w, str>, A<'w> = bool>"
|
||||
//
|
||||
// Snapshots: Check that we do not render any where-clauses for those associated types since all of
|
||||
// the trait bounds contained within were moved to the bounds of the respective item.
|
||||
//
|
||||
// @snapshot out0 - '//*[@id="associatedtype.Out0"]/*[@class="code-header"]'
|
||||
// @snapshot out9 - '//*[@id="associatedtype.Out9"]/*[@class="code-header"]'
|
||||
//
|
||||
// @has - '//*[@id="tymethod.make"]' \
|
||||
// "fn make<F>(F, impl FnMut(&str) -> bool)\
|
||||
// where \
|
||||
// F: FnOnce(u32) -> String, \
|
||||
// Self::Out2<()>: Protocol<u8, Q0 = Self::Item, Q1 = ()>"
|
||||
pub use aux::Main;
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
pub trait Main {
|
||||
type Item;
|
||||
|
||||
type Out0: Support<Item = ()>;
|
||||
type Out1: Support<Item = Self::Item>;
|
||||
type Out2<T>: Support<Item = T>;
|
||||
type Out3: Support<Produce<()> = bool>;
|
||||
type Out4<T>: Support<Produce<T> = T>;
|
||||
type Out5: Support<Output<'static> = &'static ()>;
|
||||
type Out6: for<'a> Support<Output<'a> = &'a ()>;
|
||||
type Out7: Support<Item = String, Produce<i32> = u32> + Unrelated;
|
||||
type Out8: Unrelated + Protocol<i16, Q1 = u128, Q0 = ()>;
|
||||
type Out9: FnMut(i32) -> bool + Clone;
|
||||
type Out10<'q>: Support<Output<'q> = ()>;
|
||||
type Out11: for<'r, 's> Helper<A<'s> = &'s (), B<'r> = ()>;
|
||||
type Out12: for<'w> Helper<B<'w> = std::borrow::Cow<'w, str>, A<'w> = bool>;
|
||||
|
||||
fn make<F>(_: F, _: impl FnMut(&str) -> bool)
|
||||
where
|
||||
F: FnOnce(u32) -> String,
|
||||
Self::Out2<()>: Protocol<u8, Q0 = Self::Item, Q1 = ()>;
|
||||
}
|
||||
|
||||
pub trait Support {
|
||||
type Item;
|
||||
type Output<'a>;
|
||||
type Produce<T>;
|
||||
}
|
||||
|
||||
pub trait Protocol<K> {
|
||||
type Q0;
|
||||
type Q1;
|
||||
}
|
||||
|
||||
pub trait Unrelated {}
|
||||
|
||||
pub trait Helper {
|
||||
type A<'q>;
|
||||
type B<'q>;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue