Flexibility brings not only implementation complexification, but also doc complexification. Maybe there is a way to battle this?
Consider a impl Trait
world and there was a public function
fn qqq() -> impl Mmm;
But after iterations of making it more and more advanced (while retaining backwards compatibility), it ended up like:
fn qqq<X = ResonableDefault>() -> HorribleMonster<Dread,Fear<Danger>>;
impl<T,Y> Abomination<Y> for HorribleMonster<T,Y>;
impl<T,Y> Mmm for HorribleMonster<T,Y>;
impl<T,Y> Atrocity<T> for HorribleMonster<T,Y>;
Juding just from signature of qqq
it’s not immediately obvious that the main thing and main usage of the monster is Mmm
, which was clearly communicated by impl Mmm
before.
Also type parameter X
is only for an obscure optimization majority of users won’t care about.
So for documentation (including compiler messages) purposes qqq
still wants to be cute little fn qqq() -> impl Mmm;
.
Can there be two modes of rustdoc pages (like a JavaScript toggler): easy mode and reference mode?
In easy mode some defaulted type parameters would be hidden and some return types be replaced with a trait (as if in impl Trait
, but in reality it’s a concrete type), maybe some methods hidden outright.
Like an boosted #[doc(hidden)]
It may be implemented as mock module with simplified structs, enums, traits, fns just for the doc, with the compiler checking that the mock module is a subset of the real module.
Or it may be just some doc attributes tuning the way which is easy content and which is advanced content.
Precedent: CMake’s “advanced” options