diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2021-03-03 16:27:38 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-03 16:27:38 +0900 |
| commit | 9a827d9f7e3d0f256f832b6f42f87aefa4648d0a (patch) | |
| tree | c6528f7f25f1ac63087eb08c9a3e48cc6c1492a8 /src/librustdoc/html | |
| parent | 35dbef235048f9a2939dc20effe083ca483c37ff (diff) | |
| parent | 41fc58b7b56cbc1bf70b8928ba053110fa65a34b (diff) | |
| download | rust-9a827d9f7e3d0f256f832b6f42f87aefa4648d0a.tar.gz rust-9a827d9f7e3d0f256f832b6f42f87aefa4648d0a.zip | |
Rollup merge of #81223 - GuillaumeGomez:generate-redirect-map, r=jyn514
[rustdoc] Generate redirect map file
Fixes #81134.
So with this code:
```rust
#![crate_name = "foo"]
pub use private::Quz;
pub use hidden::Bar;
mod private {
pub struct Quz;
}
#[doc(hidden)]
pub mod hidden {
pub struct Bar;
}
#[macro_export]
macro_rules! foo {
() => {}
}
```
It generates:
```json
{
"foo/macro.foo!.html": "foo/macro.foo.html",
"foo/private/struct.Quz.html": "foo/struct.Quz.html",
"foo/hidden/struct.Bar.html": "foo/struct.Bar.html"
}
```
Do the pathes look as you expected ````@pietroalbini?````
r? ````@jyn514````
Diffstat (limited to 'src/librustdoc/html')
| -rw-r--r-- | src/librustdoc/html/render/mod.rs | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 4e762a40f08..394c57c7214 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -111,6 +111,10 @@ crate struct Context<'tcx> { /// real location of an item. This is used to allow external links to /// publicly reused items to redirect to the right location. crate render_redirect_pages: bool, + /// `None` by default, depends on the `generate-redirect-map` option flag. If this field is set + /// to `Some(...)`, it'll store redirections and then generate a JSON file at the top level of + /// the crate. + crate redirections: Option<Rc<RefCell<FxHashMap<String, String>>>>, /// The map used to ensure all generated 'id=' attributes are unique. id_map: Rc<RefCell<IdMap>>, /// Tracks section IDs for `Deref` targets so they match in both the main @@ -404,6 +408,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> { static_root_path, generate_search_filter, unstable_features, + generate_redirect_map, .. } = options; @@ -509,6 +514,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> { all: Rc::new(RefCell::new(AllTypes::new())), errors: Rc::new(receiver), cache: Rc::new(cache), + redirections: if generate_redirect_map { Some(Default::default()) } else { None }, }; CURRENT_DEPTH.with(|s| s.set(0)); @@ -587,6 +593,15 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> { &style_files, ); self.shared.fs.write(&settings_file, v.as_bytes())?; + if let Some(redirections) = self.redirections.take() { + if !redirections.borrow().is_empty() { + let redirect_map_path = + self.dst.join(&*krate.name.as_str()).join("redirect-map.json"); + let paths = serde_json::to_string(&*redirections.borrow()).unwrap(); + self.shared.ensure_dir(&self.dst.join(&*krate.name.as_str()))?; + self.shared.fs.write(&redirect_map_path, paths.as_bytes())?; + } + } // Flush pending errors. Arc::get_mut(&mut self.shared).unwrap().fs.close(); @@ -675,9 +690,17 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> { // to the new one (without). if item_type == ItemType::Macro { let redir_name = format!("{}.{}!.html", item_type, name); - let redir_dst = self.dst.join(redir_name); - let v = layout::redirect(file_name); - self.shared.fs.write(&redir_dst, v.as_bytes())?; + if let Some(ref redirections) = self.redirections { + let crate_name = &self.shared.layout.krate; + redirections.borrow_mut().insert( + format!("{}/{}", crate_name, redir_name), + format!("{}/{}", crate_name, file_name), + ); + } else { + let v = layout::redirect(file_name); + let redir_dst = self.dst.join(redir_name); + self.shared.fs.write(&redir_dst, v.as_bytes())?; + } } } Ok(()) @@ -1588,17 +1611,27 @@ impl Context<'_> { &self.shared.style_files, ) } else { - let mut url = self.root_path(); if let Some(&(ref names, ty)) = self.cache.paths.get(&it.def_id) { + let mut path = String::new(); for name in &names[..names.len() - 1] { - url.push_str(name); - url.push('/'); + path.push_str(name); + path.push('/'); + } + path.push_str(&item_path(ty, names.last().unwrap())); + match self.redirections { + Some(ref redirections) => { + let mut current_path = String::new(); + for name in &self.current { + current_path.push_str(name); + current_path.push('/'); + } + current_path.push_str(&item_path(ty, names.last().unwrap())); + redirections.borrow_mut().insert(current_path, path); + } + None => return layout::redirect(&format!("{}{}", self.root_path(), path)), } - url.push_str(&item_path(ty, names.last().unwrap())); - layout::redirect(&url) - } else { - String::new() } + String::new() } } |
