diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 9846073cad4bc..1239f4d575a34 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -284,7 +284,7 @@ pub struct Cache { /// found on that implementation. pub impls: FxHashMap>, - /// Maintains a mapping of local crate `NodeId`s to the fully qualified name + /// Maintains a mapping of local crate `DefId`s to the fully qualified name /// and "short type description" of that node. This is used when generating /// URLs when a type is being linked to. External paths are not located in /// this map because the `External` type itself has all the information @@ -702,7 +702,7 @@ pub fn run(mut krate: clean::Crate, /// Builds the search index from the collected metadata fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { - let mut nodeid_to_pathid = FxHashMap::default(); + let mut defid_to_pathid = FxHashMap::default(); let mut crate_items = Vec::with_capacity(cache.search_index.len()); let mut crate_paths = Vec::::new(); @@ -726,21 +726,21 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { } } - // Reduce `NodeId` in paths into smaller sequential numbers, + // Reduce `DefId` in paths into smaller sequential numbers, // and prune the paths that do not appear in the index. let mut lastpath = String::new(); let mut lastpathid = 0usize; for item in search_index { - item.parent_idx = item.parent.map(|nodeid| { - if nodeid_to_pathid.contains_key(&nodeid) { - *nodeid_to_pathid.get(&nodeid).unwrap() + item.parent_idx = item.parent.map(|defid| { + if defid_to_pathid.contains_key(&defid) { + *defid_to_pathid.get(&defid).unwrap() } else { let pathid = lastpathid; - nodeid_to_pathid.insert(nodeid, pathid); + defid_to_pathid.insert(defid, pathid); lastpathid += 1; - let &(ref fqp, short) = paths.get(&nodeid).unwrap(); + let &(ref fqp, short) = paths.get(&defid).unwrap(); crate_paths.push(((short as usize), fqp.last().unwrap().clone()).to_json()); pathid } @@ -1487,8 +1487,8 @@ impl DocFolder for Cache { clean::ForeignFunctionItem(..) | clean::ForeignStaticItem(..) | clean::ConstantItem(..) | clean::StaticItem(..) | clean::UnionItem(..) | clean::ForeignTypeItem | - clean::MacroItem(..) | clean::ProcMacroItem(..) - if !self.stripped_mod => { + clean::MacroItem(..) | clean::ProcMacroItem(..) | + clean::VariantItem(..) if !self.stripped_mod => { // Re-exported items mean that the same id can show up twice // in the rustdoc ast that we're looking at. We know, // however, that a re-exported item doesn't show up in the @@ -1503,13 +1503,6 @@ impl DocFolder for Cache { } self.add_aliases(&item); } - // Link variants to their parent enum because pages aren't emitted - // for each variant. - clean::VariantItem(..) if !self.stripped_mod => { - let mut stack = self.stack.clone(); - stack.pop(); - self.paths.insert(item.def_id, (stack, ItemType::Enum)); - } clean::PrimitiveItem(..) if item.visibility.is_some() => { self.add_aliases(&item); @@ -1524,7 +1517,7 @@ impl DocFolder for Cache { let orig_parent_is_trait_impl = self.parent_is_trait_impl; let parent_pushed = match item.inner { clean::TraitItem(..) | clean::EnumItem(..) | clean::ForeignTypeItem | - clean::StructItem(..) | clean::UnionItem(..) => { + clean::StructItem(..) | clean::UnionItem(..) | clean::VariantItem(..) => { self.parent_stack.push(item.def_id); self.parent_is_trait_impl = false; true diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js index 17a940cc4c9f8..7dcdffdd8eb05 100644 --- a/src/librustdoc/html/static/main.js +++ b/src/librustdoc/html/static/main.js @@ -1306,14 +1306,15 @@ function getSearchElement() { var href; var type = itemTypes[item.ty]; var name = item.name; + var path = item.path; if (type === "mod") { - displayPath = item.path + "::"; - href = rootPath + item.path.replace(/::/g, "/") + "/" + + displayPath = path + "::"; + href = rootPath + path.replace(/::/g, "/") + "/" + name + "/index.html"; } else if (type === "primitive" || type === "keyword") { displayPath = ""; - href = rootPath + item.path.replace(/::/g, "/") + + href = rootPath + path.replace(/::/g, "/") + "/" + type + "." + name + ".html"; } else if (type === "externcrate") { displayPath = ""; @@ -1322,14 +1323,27 @@ function getSearchElement() { var myparent = item.parent; var anchor = "#" + type + "." + name; var parentType = itemTypes[myparent.ty]; + var pageType = parentType; + var pageName = myparent.name; + if (parentType === "primitive") { displayPath = myparent.name + "::"; + } else if (type === "structfield" && parentType === "variant") { + // Structfields belonging to variants are special: the + // final path element is the enum name. + var splitPath = item.path.split("::"); + var enumName = splitPath.pop(); + path = splitPath.join("::"); + displayPath = path + "::" + enumName + "::" + myparent.name + "::"; + anchor = "#variant." + myparent.name + ".field." + name; + pageType = "enum"; + pageName = enumName; } else { - displayPath = item.path + "::" + myparent.name + "::"; + displayPath = path + "::" + myparent.name + "::"; } - href = rootPath + item.path.replace(/::/g, "/") + - "/" + parentType + - "." + myparent.name + + href = rootPath + path.replace(/::/g, "/") + + "/" + pageType + + "." + pageName + ".html" + anchor; } else { displayPath = item.path + "::"; @@ -1611,7 +1625,7 @@ function getSearchElement() { // (String) name] var paths = rawSearchIndex[crate].p; - // convert `paths` into an object form + // convert `rawPaths` entries into object form var len = paths.length; for (i = 0; i < len; ++i) { paths[i] = {ty: paths[i][0], name: paths[i][1]};