Description
In the latest nightly (I’ve tested 62ebe3a2b 2023-09-08
), from #115201 we get better/more documentation on type aliases, including inherent and trait impls of the aliased type.
For some crates, this can have a severe effect on the size of the generated documentation (and the time it takes to generate it).
I’ve pointed this out on the PR after merging, too ( #115201 (comment) ), but it’s better tracked as a separate issue, since the change is overall really nice, and even in some of these cases, the larger documentation is a tradeoff against arguably better documentation.
The crates I’ve tested are nalgebra
and typenum
. The nalgebra
crate features a single and very impl
-rich Matrix
type together with a very large number of type aliases for Matrix
. These aliases at the moment contain notices like
Because this is an alias, not all its methods are listed here. See the
Matrix
type too.
which indicates, a nice inlined listing of (an appropriately filtered list of) relevant impl
s is a good addition. However, I’m also noticing the generated docs grow significantly in size. Using default features, I see between 1.72
and the abovementioned nightly, the size grows from 27MB to 515MB.
At the very least, it’s probably quite desired that the significant number of deprecated aliases don’t create extra HTML bloat.
Looking at typenum
, it features a handful of types like in particular UInt
, NInt
, and PInt
for type-level unsigned, and signed (positive and negative) integers, each of which come with a significant amount of trait impl
s, though by far not as large as nalgebra
’s Matrix
’s impl
s list. However, the number of type aliases involving these is absolutely huge, and the end result for my test was a size increase from 44MB to 523MB for the generated documentation. For the case of typenum
, all this extra HTML content seems – at least to me – pretty much unnecessary.
How to address this?
It seems to me that only a handful of crates like this are really negatively affected. While for the case of deprecated items, we could decide from the side of rustdoc
to just not include the impl
s automatically, for a case like typenum
it seems to me like an opt-out might be appropriate.
Right now, a way typenum
could avoid the issue would be to use #[doc(hidden)]
to entirely hide the alias. (Then, it could still describe in prose which numbers are supported by aliases.) But that seems like it has unnecessary downsides in reader experience. One opt-in solution for hiding impls on an alias could thus be an alternative attribute, similar to existing #[doc(hidden)]
and #[doc(inline)]
attributes, e.g. it could be named #[doc(no_impls)]
or #[doc(hidden_impls)]
(and [at least initially] only be supported only for type aliases).
Further evaluation
I should probably also look into the effects on ndarray
. And I might be unaware – off the top of my head – of other crates that could be significantly affected. Feel free to point out any crates that have similarly significant additional “bloated” documentation from this change, so we can evaluate whether the discussed or to-be-discussed approaches help in those cases as well.