Rollup merge of #95316 - fmease:rustdoc-discr-req-prov-assoc-consts-tys, r=notriddle,GuillaumeGomez
Rustdoc: Discriminate required and provided associated constants and types Currently, rustdoc merely separates required and provided associated _functions_ (i.e. methods). This PR extends this to constants (fixes #94652) and types. This makes the documentation of all three kinds of associated items more alike and consistent. As an aside, associated types may actually be provided / have a default when users enable the unstable feature `associated_type_defaults`. | Before | After | |---|---| |  |  | |  |  | ### `clean::types::ItemKind` modification * `ItemKind::TypedefItem(.., true)` → `ItemKind::AssocTypeItem(..)` * `ItemKind::TypedefItem(.., false)` → `ItemKind::TypedefItem(..)` Further, I added `ItemKind::TyAssoc{Const,Type}Item`, the “required” variant of `ItemKind::Assoc{Const,Type}Item`, analogous to `ItemKind::TyMethodItem` with `ItemKind::MethodItem`. These new variants don't contain new information really, they are just the result of me getting rid of the `Option<_>` field in `AssocConstItem` and `AssocTypeItem`. **Goal**: Make associated items more consistent. Originally I thought modifying `ItemKind` was necessary to achieve the new functionality of this PR but in retrospect, it does not. If you don't like the changes to `ItemKind`, I think I _can_ get rid of them. This change is the root cause of those tiny changes in a lot of different files. ### Concerns and Open Questions * **breaking changes** to hyperlinks: Some heading IDs change: * `associated-const` (sic!) -> `{provided,required}-associated-consts` * `associated-types` -> `{provided,required}-associated-types` * **verbosity** of the headings _{Required,Provided} Associated {Constants,Types}_ * For some files, I am not sure if the changes I made are correct. So please take extra care when reviewing `conversions.rs` (conversion to JSON), `cache.rs`/`fold_item`, `stripper.rs`/`fold_item`, `check_doc_test_visibility.rs`/`should_have_doc_example`, `collect_intra_doc_links.rs`/`from_assoc_item` * JSON output: I still map `AssocTypeItem`s to `Typedef` etc. (FIXME)
This commit is contained in:
commit
0ec00c0ba3
22 changed files with 407 additions and 249 deletions
|
|
@ -1,8 +1,8 @@
|
|||
pub trait Foo {
|
||||
// @has assoc_consts/trait.Foo.html '//*[@class="rust trait"]' \
|
||||
// 'const FOO: usize;'
|
||||
// 'const FOO: usize = 13usize;'
|
||||
// @has - '//*[@id="associatedconstant.FOO"]' 'const FOO: usize'
|
||||
const FOO: usize = 12;
|
||||
const FOO: usize = 12 + 1;
|
||||
// @has - '//*[@id="associatedconstant.FOO_NO_DEFAULT"]' 'const FOO_NO_DEFAULT: bool'
|
||||
const FOO_NO_DEFAULT: bool;
|
||||
// @!has - FOO_HIDDEN
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
<a class="fnname">provided</a>(&self)
|
||||
|
|
@ -1,9 +1,23 @@
|
|||
// aux-build:rustdoc-extern-default-method.rs
|
||||
// ignore-cross-compile
|
||||
// ignore-tidy-linelength
|
||||
|
||||
extern crate rustdoc_extern_default_method as ext;
|
||||
|
||||
// For this test, the dependency is compiled but not documented.
|
||||
//
|
||||
// Still, the struct from the external crate and its impl should be documented since
|
||||
// the struct is re-exported from this crate.
|
||||
// However, the method in the trait impl should *not* have a link (an `href` attribute) to
|
||||
// its corresponding item in the trait declaration since it would otherwise be broken.
|
||||
//
|
||||
// In older versions of rustdoc, the impl item (`a[@class="fnname"]`) used to link to
|
||||
// `#method.provided` – i.e. "to itself". Put in quotes since that was actually incorrect in
|
||||
// general: If the type `Struct` also had an inherent method called `provided`, the impl item
|
||||
// would link to that one even though those two methods are distinct items!
|
||||
|
||||
// @count extern_default_method/struct.Struct.html '//*[@id="method.provided"]' 1
|
||||
// @has extern_default_method/struct.Struct.html '//*[@id="method.provided"]//a[@class="fnname"]/@href' #method.provided
|
||||
// @count extern_default_method/struct.Struct.html '//*[@id="method.provided"]//a[@class="fnname"]' 1
|
||||
// @snapshot no_href_on_anchor - '//*[@id="method.provided"]//a[@class="fnname"]'
|
||||
// @has extern_default_method/struct.Struct.html '//*[@id="method.provided"]//a[@class="anchor"]/@href' #method.provided
|
||||
pub use ext::Struct;
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#![feature(no_core)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(inherent_associated_types)]
|
||||
#![feature(lang_items)]
|
||||
#![no_core]
|
||||
|
||||
/// [Self::f]
|
||||
|
|
@ -35,3 +36,6 @@ pub struct S;
|
|||
impl S {
|
||||
pub fn f() {}
|
||||
}
|
||||
|
||||
#[lang = "sized"]
|
||||
pub trait Sized {}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
#![feature(associated_type_defaults)]
|
||||
#![crate_name = "foo"]
|
||||
|
||||
// @has foo/trait.Foo.html
|
||||
|
|
@ -5,12 +6,18 @@
|
|||
// @has - '//*[@class="sidebar-elems"]//section//a' 'bar'
|
||||
// @has - '//*[@class="sidebar-title"]/a[@href="#provided-methods"]' 'Provided Methods'
|
||||
// @has - '//*[@class="sidebar-elems"]//section//a' 'foo'
|
||||
// @has - '//*[@class="sidebar-title"]/a[@href="#associated-const"]' 'Associated Constants'
|
||||
// @has - '//*[@class="sidebar-title"]/a[@href="#required-associated-consts"]' 'Required Associated Constants'
|
||||
// @has - '//*[@class="sidebar-elems"]//section//a' 'FOO'
|
||||
// @has - '//*[@class="sidebar-title"]/a[@href="#provided-associated-consts"]' 'Provided Associated Constants'
|
||||
// @has - '//*[@class="sidebar-elems"]//section//a' 'BAR'
|
||||
// @has - '//*[@class="sidebar-title"]/a[@href="#associated-types"]' 'Associated Types'
|
||||
// @has - '//*[@class="sidebar-title"]/a[@href="#required-associated-types"]' 'Required Associated Types'
|
||||
// @has - '//*[@class="sidebar-elems"]//section//a' 'Output'
|
||||
// @has - '//*[@class="sidebar-title"]/a[@href="#provided-associated-types"]' 'Provided Associated Types'
|
||||
// @has - '//*[@class="sidebar-elems"]//section//a' 'Extra'
|
||||
pub trait Foo {
|
||||
const FOO: usize;
|
||||
const BAR: u32 = 0;
|
||||
type Extra: Copy = ();
|
||||
type Output: ?Sized;
|
||||
|
||||
fn foo() {}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue