From 0c742d263cd5da7b82ef63ced70622f9ee8ebb88 Mon Sep 17 00:00:00 2001 From: Oliver Middleton Date: Sun, 12 Jun 2016 18:27:17 +0100 Subject: [PATCH] rustdoc: Fix redirect pages for renamed reexports We need to use the name of the target not the name of the current item when creating the link. --- src/librustdoc/html/render.rs | 22 +++++++++----------- src/test/rustdoc/redirect-rename.rs | 32 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 src/test/rustdoc/redirect-rename.rs diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 617d2a9b58d..0b6065c56c6 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1343,12 +1343,12 @@ impl Context { } else { let mut url = repeat("../").take(cx.current.len()) .collect::(); - if let Some(&(ref names, _)) = cache().paths.get(&it.def_id) { + if let Some(&(ref names, ty)) = cache().paths.get(&it.def_id) { for name in &names[..names.len() - 1] { url.push_str(name); url.push_str("/"); } - url.push_str(&item_path(it)); + url.push_str(&item_path(ty, names.last().unwrap())); layout::redirect(writer, &url)?; } } @@ -1409,7 +1409,8 @@ impl Context { render(&mut buf, self, &item, true).unwrap(); // buf will be empty if the item is stripped and there is no redirect for it if !buf.is_empty() { - let joint_dst = self.dst.join(&item_path(&item)); + let joint_dst = self.dst.join(&item_path(shortty(&item), + item.name.as_ref().unwrap())); try_err!(fs::create_dir_all(&self.dst), &self.dst); let mut dst = try_err!(File::create(&joint_dst), &joint_dst); try_err!(dst.write_all(&buf), &joint_dst); @@ -1531,7 +1532,7 @@ impl<'a> Item<'a> { Some(format!("{root}{path}/{file}?gotosrc={goto}", root = root, path = path[..path.len() - 1].join("/"), - file = item_path(self.item), + file = item_path(shortty(self.item), self.item.name.as_ref().unwrap()), goto = self.item.def_id.index.as_usize())) } } @@ -1623,13 +1624,10 @@ impl<'a> fmt::Display for Item<'a> { } } -fn item_path(item: &clean::Item) -> String { - if item.is_mod() { - format!("{}/index.html", item.name.as_ref().unwrap()) - } else { - format!("{}.{}.html", - shortty(item).to_static_str(), - *item.name.as_ref().unwrap()) +fn item_path(ty: ItemType, name: &str) -> String { + match ty { + ItemType::Module => format!("{}/index.html", name), + _ => format!("{}.{}.html", ty.to_static_str(), name), } } @@ -1821,7 +1819,7 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context, docs = shorter(Some(&Markdown(doc_value).to_string())), class = shortty(myitem), stab = myitem.stability_class(), - href = item_path(myitem), + href = item_path(shortty(myitem), myitem.name.as_ref().unwrap()), title = full_path(cx, myitem))?; } } diff --git a/src/test/rustdoc/redirect-rename.rs b/src/test/rustdoc/redirect-rename.rs new file mode 100644 index 00000000000..b7c702dcc1f --- /dev/null +++ b/src/test/rustdoc/redirect-rename.rs @@ -0,0 +1,32 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![crate_name = "foo"] + +mod hidden { + // @has foo/hidden/struct.Foo.html + // @has - '//p/a' '../../foo/struct.FooBar.html' + pub struct Foo {} + + // @has foo/hidden/bar/index.html + // @has - '//p/a' '../../foo/baz/index.html' + pub mod bar { + // @has foo/hidden/bar/struct.Thing.html + // @has - '//p/a' '../../foo/baz/struct.Thing.html' + pub struct Thing {} + } +} + +// @has foo/struct.FooBar.html +pub use hidden::Foo as FooBar; + +// @has foo/baz/index.html +// @has foo/baz/struct.Thing.html +pub use hidden::bar as baz;