about summary refs log tree commit diff
path: root/src/librustdoc/html/render
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2021-04-13 20:00:36 +0200
committerGuillaume Gomez <guillaume.gomez@huawei.com>2021-08-05 23:08:28 +0200
commitb689cedc0e44a6a1f75b0589ecb2eb4e890e71e4 (patch)
treec6500885d5bf80bd17fd06110d5cb2e2c4b88cce /src/librustdoc/html/render
parent83dcd30ee0639b4f7dc55d370953a76f21ba755f (diff)
downloadrust-b689cedc0e44a6a1f75b0589ecb2eb4e890e71e4.tar.gz
rust-b689cedc0e44a6a1f75b0589ecb2eb4e890e71e4.zip
Generate links for methods as well
Diffstat (limited to 'src/librustdoc/html/render')
-rw-r--r--src/librustdoc/html/render/span_map.rs52
1 files changed, 36 insertions, 16 deletions
diff --git a/src/librustdoc/html/render/span_map.rs b/src/librustdoc/html/render/span_map.rs
index fa1f8954a15..2895b4abfb2 100644
--- a/src/librustdoc/html/render/span_map.rs
+++ b/src/librustdoc/html/render/span_map.rs
@@ -5,7 +5,7 @@ use rustc_data_structures::fx::FxHashMap;
 use rustc_hir::def::{DefKind, Res};
 use rustc_hir::def_id::DefId;
 use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
-use rustc_hir::{/*ExprKind, */ GenericParam, GenericParamKind, HirId};
+use rustc_hir::{ExprKind, GenericParam, GenericParamKind, HirId};
 use rustc_middle::ty::TyCtxt;
 use rustc_span::Span;
 
@@ -20,14 +20,14 @@ crate fn collect_spans_and_sources(
     krate: clean::Crate,
     src_root: &std::path::Path,
     include_sources: bool,
-    generate_link_to_definition: bool,
+    _generate_link_to_definition: bool,
 ) -> (clean::Crate, FxHashMap<std::path::PathBuf, String>, FxHashMap<(u32, u32), LinkFromSrc>) {
     let mut visitor = SpanMapVisitor { tcx, matches: FxHashMap::default() };
 
     if include_sources {
-        if generate_link_to_definition {
-            intravisit::walk_crate(&mut visitor, tcx.hir().krate());
-        }
+        // if generate_link_to_definition {
+        intravisit::walk_crate(&mut visitor, tcx.hir().krate());
+        // }
         let (krate, sources) = sources::collect_local_sources(tcx, src_root, krate);
         (krate, sources, visitor.matches)
     } else {
@@ -94,17 +94,37 @@ impl Visitor<'tcx> for SpanMapVisitor<'tcx> {
         intravisit::walk_path(self, path);
     }
 
-    // fn visit_expr(&mut self, expr: &'tcx rustc_hir::Expr<'tcx>) {
-    //     match expr.kind {
-    //         ExprKind::MethodCall(segment, method_span, _, _) => {
-    //             if let Some(hir_id) = segment.hir_id {
-    //                 // call https://doc.rust-lang.org/beta/nightly-rustc/rustc_middle/ty/context/struct.TypeckResults.html#method.type_dependent_def_id
-    //             }
-    //         }
-    //         _ => {}
-    //     }
-    //     intravisit::walk_expr(self, expr);
-    // }
+    fn visit_expr(&mut self, expr: &'tcx rustc_hir::Expr<'tcx>) {
+        match expr.kind {
+            ExprKind::MethodCall(segment, method_span, _, _) => {
+                if let Some(hir_id) = segment.hir_id {
+                    let hir = self.tcx.hir();
+                    let body_id = hir.enclosing_body_owner(hir_id);
+                    // FIXME: this is showing error messages for parts of the code that are not
+                    // compiled (because of cfg)!
+                    let typeck_results = self.tcx.typeck_body(
+                        hir.maybe_body_owned_by(body_id).expect("a body which isn't a body"),
+                    );
+                    if let Some(def_id) = typeck_results.type_dependent_def_id(expr.hir_id) {
+                        match hir.span_if_local(def_id) {
+                            Some(span) => {
+                                self.matches
+                                    .insert(span_to_tuple(method_span), LinkFromSrc::Local(span));
+                            }
+                            None => {
+                                self.matches.insert(
+                                    span_to_tuple(method_span),
+                                    LinkFromSrc::External(def_id),
+                                );
+                            }
+                        }
+                    }
+                }
+            }
+            _ => {}
+        }
+        intravisit::walk_expr(self, expr);
+    }
 
     fn visit_use(&mut self, path: &'tcx rustc_hir::Path<'tcx>, id: HirId) {
         self.handle_path(path, None);