diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2015-04-06 17:56:35 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2015-04-07 17:54:34 -0700 |
| commit | 641bca06c82e2fa744e7b14bc45cfa501baf57e6 (patch) | |
| tree | a058733e05332ad362f2f993b830277600c9db3b /src/librustdoc/html/format.rs | |
| parent | fcc89ea5006441350f0275946ff6db84a1118e49 (diff) | |
| download | rust-641bca06c82e2fa744e7b14bc45cfa501baf57e6.tar.gz rust-641bca06c82e2fa744e7b14bc45cfa501baf57e6.zip | |
rustdoc: Link "Trait Implementations" to sources
All methods listed in "Trait Implementations" now hyperlink to the source trait instead of themselves, allowing easy browsing of the documentation of a trait method. Closes #17476
Diffstat (limited to 'src/librustdoc/html/format.rs')
| -rw-r--r-- | src/librustdoc/html/format.rs | 108 |
1 files changed, 41 insertions, 67 deletions
diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index a52c996bdb7..365e34476aa 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -281,48 +281,46 @@ impl fmt::Display for clean::Path { } } +pub fn href(did: ast::DefId) -> Option<(String, ItemType, Vec<String>)> { + let cache = cache(); + let loc = CURRENT_LOCATION_KEY.with(|l| l.borrow().clone()); + let &(ref fqp, shortty) = match cache.paths.get(&did) { + Some(p) => p, + None => return None, + }; + let mut url = if ast_util::is_local(did) || cache.inlined.contains(&did) { + repeat("../").take(loc.len()).collect::<String>() + } else { + match cache.extern_locations[&did.krate] { + render::Remote(ref s) => s.to_string(), + render::Local => repeat("../").take(loc.len()).collect::<String>(), + render::Unknown => return None, + } + }; + for component in &fqp[..fqp.len() - 1] { + url.push_str(component); + url.push_str("/"); + } + match shortty { + ItemType::Module => { + url.push_str(fqp.last().unwrap()); + url.push_str("/index.html"); + } + _ => { + url.push_str(shortty.to_static_str()); + url.push_str("."); + url.push_str(fqp.last().unwrap()); + url.push_str(".html"); + } + } + Some((url, shortty, fqp.to_vec())) +} + /// Used when rendering a `ResolvedPath` structure. This invokes the `path` /// rendering function with the necessary arguments for linking to a local path. -fn resolved_path(w: &mut fmt::Formatter, did: ast::DefId, p: &clean::Path, +fn resolved_path(w: &mut fmt::Formatter, did: ast::DefId, path: &clean::Path, print_all: bool) -> fmt::Result { - path(w, p, print_all, - |cache, loc| { - if ast_util::is_local(did) || cache.inlined.contains(&did) { - Some(repeat("../").take(loc.len()).collect::<String>()) - } else { - match cache.extern_locations[&did.krate] { - render::Remote(ref s) => Some(s.to_string()), - render::Local => { - Some(repeat("../").take(loc.len()).collect::<String>()) - } - render::Unknown => None, - } - } - }, - |cache| { - match cache.paths.get(&did) { - None => None, - Some(&(ref fqp, shortty)) => Some((fqp.clone(), shortty)) - } - }) -} - -fn path<F, G>(w: &mut fmt::Formatter, - path: &clean::Path, - print_all: bool, - root: F, - info: G) - -> fmt::Result where - F: FnOnce(&render::Cache, &[String]) -> Option<String>, - G: FnOnce(&render::Cache) -> Option<(Vec<String>, ItemType)>, -{ - // The generics will get written to both the title and link let last = path.segments.last().unwrap(); - let generics = format!("{}", last.params); - - let loc = CURRENT_LOCATION_KEY.with(|l| l.borrow().clone()); - let cache = cache(); - let abs_root = root(&*cache, &loc); let rel_root = match &*path.segments[0].name { "self" => Some("./".to_string()), _ => None, @@ -334,8 +332,7 @@ fn path<F, G>(w: &mut fmt::Formatter, Some(root) => { let mut root = String::from_str(&root); for seg in &path.segments[..amt] { - if "super" == seg.name || - "self" == seg.name { + if "super" == seg.name || "self" == seg.name { try!(write!(w, "{}::", seg.name)); } else { root.push_str(&seg.name); @@ -355,37 +352,14 @@ fn path<F, G>(w: &mut fmt::Formatter, } } - match info(&*cache) { - // This is a documented path, link to it! - Some((ref fqp, shortty)) if abs_root.is_some() => { - let mut url = String::from_str(&abs_root.unwrap()); - let to_link = &fqp[..fqp.len() - 1]; - for component in to_link { - url.push_str(component); - url.push_str("/"); - } - match shortty { - ItemType::Module => { - url.push_str(fqp.last().unwrap()); - url.push_str("/index.html"); - } - _ => { - url.push_str(shortty.to_static_str()); - url.push_str("."); - url.push_str(fqp.last().unwrap()); - url.push_str(".html"); - } - } - + match href(did) { + Some((url, shortty, fqp)) => { try!(write!(w, "<a class='{}' href='{}' title='{}'>{}</a>", shortty, url, fqp.connect("::"), last.name)); } - - _ => { - try!(write!(w, "{}", last.name)); - } + _ => try!(write!(w, "{}", last.name)), } - try!(write!(w, "{}", generics)); + try!(write!(w, "{}", last.params)); Ok(()) } |
