mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Rollup merge of #133180 - GuillaumeGomez:jump-to-def-links-generics, r=notriddle
[rustdoc] Fix items with generics not having their jump to def link generated Because the span originally included the generics, during the highlighting, it was not retrieved and therefore its jump to def link was not generated. r? ``@notriddle``
This commit is contained in:
commit
f66e1749c0
@ -36,7 +36,7 @@ pub(crate) enum LinkFromSrc {
|
||||
/// It returns the `krate`, the source code files and the `span` correspondence map.
|
||||
///
|
||||
/// Note about the `span` correspondence map: the keys are actually `(lo, hi)` of `span`s. We don't
|
||||
/// need the `span` context later on, only their position, so instead of keep a whole `Span`, we
|
||||
/// need the `span` context later on, only their position, so instead of keeping a whole `Span`, we
|
||||
/// only keep the `lo` and `hi`.
|
||||
pub(crate) fn collect_spans_and_sources(
|
||||
tcx: TyCtxt<'_>,
|
||||
@ -45,9 +45,9 @@ pub(crate) fn collect_spans_and_sources(
|
||||
include_sources: bool,
|
||||
generate_link_to_definition: bool,
|
||||
) -> (FxIndexMap<PathBuf, String>, FxHashMap<Span, LinkFromSrc>) {
|
||||
if include_sources {
|
||||
let mut visitor = SpanMapVisitor { tcx, matches: FxHashMap::default() };
|
||||
|
||||
if include_sources {
|
||||
if generate_link_to_definition {
|
||||
tcx.hir().walk_toplevel_module(&mut visitor);
|
||||
}
|
||||
@ -76,7 +76,22 @@ impl<'tcx> SpanMapVisitor<'tcx> {
|
||||
} else {
|
||||
LinkFromSrc::External(def_id)
|
||||
};
|
||||
self.matches.insert(path.span, link);
|
||||
// In case the path ends with generics, we remove them from the span.
|
||||
let span = path
|
||||
.segments
|
||||
.last()
|
||||
.map(|last| {
|
||||
// In `use` statements, the included item is not in the path segments.
|
||||
// However, it doesn't matter because you can't have generics on `use`
|
||||
// statements.
|
||||
if path.span.contains(last.ident.span) {
|
||||
path.span.with_hi(last.ident.span.hi())
|
||||
} else {
|
||||
path.span
|
||||
}
|
||||
})
|
||||
.unwrap_or(path.span);
|
||||
self.matches.insert(span, link);
|
||||
}
|
||||
Res::Local(_) => {
|
||||
if let Some(span) = self.tcx.hir().res_span(path.res) {
|
||||
|
14
tests/rustdoc/link-on-path-with-generics.rs
Normal file
14
tests/rustdoc/link-on-path-with-generics.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// This test ensures that paths with generics still get their link to their definition
|
||||
// correctly generated.
|
||||
|
||||
//@ compile-flags: -Zunstable-options --generate-link-to-definition
|
||||
#![crate_name = "foo"]
|
||||
|
||||
//@ has 'src/foo/link-on-path-with-generics.rs.html'
|
||||
|
||||
pub struct Soyo<T>(T);
|
||||
pub struct Saya;
|
||||
|
||||
//@ has - '//pre[@class="rust"]//a[@href="#9"]' 'Soyo'
|
||||
//@ has - '//pre[@class="rust"]//a[@href="#10"]' 'Saya'
|
||||
pub fn bar<T>(s: Soyo<T>, x: Saya) {}
|
Loading…
Reference in New Issue
Block a user