Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rustdoc picks an odd "canonical" path for some often-reexported types #124608

Open
RalfJung opened this issue May 2, 2024 · 8 comments
Open

rustdoc picks an odd "canonical" path for some often-reexported types #124608

RalfJung opened this issue May 2, 2024 · 8 comments
Assignees
Labels
A-rustdoc-search Area: Rustdoc's search feature T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.

Comments

@RalfJung
Copy link
Member

RalfJung commented May 2, 2024

It seems that recently, rustdoc started to not show duplicate results for a type when it gets reexported. That is great! However, the name it decides to pick is sometimes odd.

Consider for instance InterpError: rustdoc shows this as miri::InterpError, which makes it look like a type defined in Miri. That's not the case though, the type is defined in rustc_middle. I would have expected this to be shown as rustc_middle::mir::interpret::InterpError -- that's the canonical path for this type, as far as I am concerned. Certainly it should be showing some rustc crate as otherwise one could easily think that this type is not available outside Miri.

Cc @rust-lang/rustdoc

@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label May 2, 2024
@notriddle notriddle self-assigned this May 2, 2024
@notriddle notriddle added T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue. A-rustdoc-search Area: Rustdoc's search feature and removed needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. labels May 2, 2024
@notriddle
Copy link
Contributor

I think this needs solved using rust-lang/rfcs#3011. The behavior you’re seeing here is the same as the behavior in the standard library (except we actually want it in that context), combined with Search preferring shorter paths.

If you want a workaround for right now, mark the re-export as #[doc(no_inline)]

@RalfJung
Copy link
Member Author

RalfJung commented May 2, 2024

If you want a workaround for right now, mark the re-export as #[doc(no_inline)]

Ah, that's what that attribute does. :D

@RalfJung
Copy link
Member Author

RalfJung commented May 2, 2024

The behavior you’re seeing here is the same as the behavior in the standard library (except we actually want it in that context), combined with Search preferring shorter paths.

The standard library feels special, in that we often want to use the std items even when they exist in core/alloc. For a collection of crates like rustc, that's not the case -- doesn't one often want to avoid re-exports there?

In the end, the best path to use depends on where in rustc one is working. Maybe the page for InterpError should list that this is available as rustc_middle::mir::interpret::InterpError, rustc_const_eval::interpret::InterpError, and miri::InterpError -- i.e., for each crate that re-exports this, show the nicest (shortest?) path in that crate.

@fmease
Copy link
Member

fmease commented May 2, 2024

Edit: Please check out #124608 (comment) first. While the user-facing behavior described below can be reproduced as described, my attempt at an explanation is incorrect.


Consider for instance InterpError: rustdoc shows this as miri::InterpError

Just to give more context to future readers: The exact outcome depends on the “current location”, i.e. which crate you are currently viewing.

If you follow the link https://doc.rust-lang.org/nightly/nightly-rustc, the current crate will be rustdoc at the time of writing because bootstrap documents it last. miri gets documented before that but obviously after rustc_middle. Therefore and for the reasons mentioned by notriddle, it's miri::InterpError that gets returned by search.

However, if you navigate to the index page of crate rustc_middle and search for InterpError again, the search result will be rustc_middle::mir::interpret::InterpError because the docs of rustc_middle get generated before miri (as mentioned) and they can't “see into the future” / reference items yet to be generated from its point of view (and search doesn't seem to be “global”).

fmease added a commit to fmease/rust that referenced this issue May 2, 2024
…r=fmease

interpret: hide some reexports in rustdoc

Cc rust-lang#124608
@RalfJung
Copy link
Member Author

RalfJung commented May 2, 2024

Ah, interesting, I had no idea the result would differ depending on the crate.

But I supposed if I use the rustc_middle crate page then items defined "later" just cannot be found at all, right?

@fmease
Copy link
Member

fmease commented May 2, 2024

if I use the rustc_middle crate page then items defined "later" just cannot be found at all, right?

Actually those items can be found contrary to the re-exports (just tested it). I don't know why there exists this discrepancy as I'm not super familiar with rustdoc search, @notriddle is the expert here.

matthiaskrgr added a commit to matthiaskrgr/rust that referenced this issue May 2, 2024
…r=fmease

interpret: hide some reexports in rustdoc

Cc rust-lang#124608
@notriddle
Copy link
Contributor

the search result will be rustc_middle::mir::interpret::InterpError because the docs of rustc_middle get generated before miri (as mentioned) and they can't “see into the future” / reference items yet to be generated from its point of view (and search doesn't seem to be “global”).

Actually those items can be found contrary to the re-exports (just tested it). I don't know why there exists this discrepancy as I'm not super familiar with rustdoc search, @notriddle is the expert here.

Rustdoc Search generates a single search index file that contains items for all crates that have been documented together, and every page in a set of docs loads the same index. When more docs are added to an existing set, the rustdoc compiler merges the new items into the existing index file.

The current crate is given higher ranking in the search results, but that's a mere ranking signal, not a necessary side-effect of the way it's built. If it's a usability problem, it can be removed.

It's more complicated for the plain HTML pages, which aren't as easy to merge as JSON files (especially since the search index was designed to be easy to merge this way).

rust-timer added a commit to rust-lang-ci/rust that referenced this issue May 2, 2024
Rollup merge of rust-lang#124627 - RalfJung:interpret-doc-no-inline, r=fmease

interpret: hide some reexports in rustdoc

Cc rust-lang#124608
@fmease
Copy link
Member

fmease commented May 2, 2024

Ah, I see. Thanks for the explanation. Sorry for spreading misinformation before.

github-actions bot pushed a commit to rust-lang/miri that referenced this issue May 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-rustdoc-search Area: Rustdoc's search feature T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

4 participants