diff --git a/src/librustdoc/html/render/span_map.rs b/src/librustdoc/html/render/span_map.rs
index fec6779965a..d4cca562d6c 100644
--- a/src/librustdoc/html/render/span_map.rs
+++ b/src/librustdoc/html/render/span_map.rs
@@ -45,9 +45,9 @@ pub(crate) fn collect_spans_and_sources(
include_sources: bool,
generate_link_to_definition: bool,
) -> (FxIndexMap, FxHashMap) {
- let mut visitor = SpanMapVisitor { tcx, matches: FxHashMap::default() };
-
if include_sources {
+ let mut visitor = SpanMapVisitor { tcx, matches: FxHashMap::default() };
+
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) {