Fix items with generics not having their jump to def link generated

This commit is contained in:
Guillaume Gomez 2024-11-18 17:56:52 +01:00
parent 8ea02578cd
commit 786b7477f6

View file

@ -45,9 +45,9 @@ pub(crate) fn collect_spans_and_sources(
include_sources: bool, include_sources: bool,
generate_link_to_definition: bool, generate_link_to_definition: bool,
) -> (FxIndexMap<PathBuf, String>, FxHashMap<Span, LinkFromSrc>) { ) -> (FxIndexMap<PathBuf, String>, FxHashMap<Span, LinkFromSrc>) {
let mut visitor = SpanMapVisitor { tcx, matches: FxHashMap::default() };
if include_sources { if include_sources {
let mut visitor = SpanMapVisitor { tcx, matches: FxHashMap::default() };
if generate_link_to_definition { if generate_link_to_definition {
tcx.hir().walk_toplevel_module(&mut visitor); tcx.hir().walk_toplevel_module(&mut visitor);
} }
@ -76,7 +76,22 @@ impl<'tcx> SpanMapVisitor<'tcx> {
} else { } else {
LinkFromSrc::External(def_id) 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(_) => { Res::Local(_) => {
if let Some(span) = self.tcx.hir().res_span(path.res) { if let Some(span) = self.tcx.hir().res_span(path.res) {