]> git.lizzy.rs Git - rust.git/commitdiff
rustdoc: Fix redirect pages for renamed reexports
authorOliver Middleton <olliemail27@gmail.com>
Sun, 12 Jun 2016 17:27:17 +0000 (18:27 +0100)
committerOliver Middleton <olliemail27@gmail.com>
Tue, 14 Jun 2016 14:24:06 +0000 (15:24 +0100)
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
src/test/rustdoc/redirect-rename.rs [new file with mode: 0644]

index 617d2a9b58d09b4a4f8fcdfd4d0b056697745e7c..0b6065c56c699e3bd99fb8200f5456019207875e 100644 (file)
@@ -1343,12 +1343,12 @@ fn render(writer: &mut io::Write, cx: &Context, it: &clean::Item,
             } else {
                 let mut url = repeat("../").take(cx.current.len())
                                            .collect::<String>();
-                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 @@ fn render(writer: &mut io::Write, cx: &Context, it: &clean::Item,
             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 @@ fn href(&self) -> Option<String> {
             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 @@ fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
     }
 }
 
-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 cmp(i1: &clean::Item, i2: &clean::Item, idx1: usize, idx2: usize) -> Ordering
                        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 (file)
index 0000000..b7c702d
--- /dev/null
@@ -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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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;