about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2024-07-22 11:12:38 -0700
committerMichael Howell <michael@notriddle.com>2024-08-20 16:51:33 -0700
commit68773c789a6a84a888b69f7287fd294b6dd3625c (patch)
tree3036577a322b906cbd89dd584080e87326b922fd
parent5a6054b4a2850d195bf54d7176b4a32382a8df49 (diff)
downloadrust-68773c789a6a84a888b69f7287fd294b6dd3625c.tar.gz
rust-68773c789a6a84a888b69f7287fd294b6dd3625c.zip
rustdoc: add separate section for module items
-rw-r--r--src/librustdoc/html/render/sidebar.rs17
-rw-r--r--tests/rustdoc/sidebar/module.rs16
-rw-r--r--tests/rustdoc/sidebar/top-toc-html.rs1
3 files changed, 31 insertions, 3 deletions
diff --git a/src/librustdoc/html/render/sidebar.rs b/src/librustdoc/html/render/sidebar.rs
index c76253c9fc3..a6b22a18de2 100644
--- a/src/librustdoc/html/render/sidebar.rs
+++ b/src/librustdoc/html/render/sidebar.rs
@@ -26,6 +26,11 @@ impl ModuleLike {
         matches!(self, ModuleLike::Crate)
     }
 }
+impl<'a> From<&'a clean::Item> for ModuleLike {
+    fn from(it: &'a clean::Item) -> ModuleLike {
+        if it.is_crate() { ModuleLike::Crate } else { ModuleLike::Module }
+    }
+}
 
 #[derive(Template)]
 #[template(path = "sidebar.html")]
@@ -119,7 +124,9 @@ pub(super) fn print_sidebar(cx: &Context<'_>, it: &clean::Item, buffer: &mut Buf
         clean::UnionItem(ref u) => sidebar_union(cx, it, u, &mut blocks),
         clean::EnumItem(ref e) => sidebar_enum(cx, it, e, &mut blocks),
         clean::TypeAliasItem(ref t) => sidebar_type_alias(cx, it, t, &mut blocks),
-        clean::ModuleItem(ref m) => blocks.push(sidebar_module(&m.items, &mut ids)),
+        clean::ModuleItem(ref m) => {
+            blocks.push(sidebar_module(&m.items, &mut ids, ModuleLike::from(it)))
+        }
         clean::ForeignTypeItem => sidebar_foreign_type(cx, it, &mut blocks),
         _ => {}
     }
@@ -561,7 +568,11 @@ pub(crate) fn sidebar_module_like(
     LinkBlock::new(header, "", item_sections)
 }
 
-fn sidebar_module(items: &[clean::Item], ids: &mut IdMap) -> LinkBlock<'static> {
+fn sidebar_module(
+    items: &[clean::Item],
+    ids: &mut IdMap,
+    module_like: ModuleLike,
+) -> LinkBlock<'static> {
     let item_sections_in_use: FxHashSet<_> = items
         .iter()
         .filter(|it| {
@@ -582,7 +593,7 @@ fn sidebar_module(items: &[clean::Item], ids: &mut IdMap) -> LinkBlock<'static>
         .map(|it| item_ty_to_section(it.type_()))
         .collect();
 
-    sidebar_module_like(item_sections_in_use, ids, ModuleLike::Module)
+    sidebar_module_like(item_sections_in_use, ids, module_like)
 }
 
 fn sidebar_foreign_type<'a>(
diff --git a/tests/rustdoc/sidebar/module.rs b/tests/rustdoc/sidebar/module.rs
new file mode 100644
index 00000000000..926af71ddfb
--- /dev/null
+++ b/tests/rustdoc/sidebar/module.rs
@@ -0,0 +1,16 @@
+#![crate_name = "foo"]
+
+//@ has 'foo/index.html'
+//@ has - '//section[@id="TOC"]/h3' 'Crate Items'
+
+//@ has 'foo/bar/index.html'
+//@ has - '//section[@id="TOC"]/h3' 'Module Items'
+pub mod bar {
+    //@ has 'foo/bar/struct.Baz.html'
+    //@ !has - '//section[@id="TOC"]/h3' 'Module Items'
+    pub struct Baz;
+}
+
+//@ has 'foo/baz/index.html'
+//@ !has - '//section[@id="TOC"]/h3' 'Module Items'
+pub mod baz {}
diff --git a/tests/rustdoc/sidebar/top-toc-html.rs b/tests/rustdoc/sidebar/top-toc-html.rs
index 6fc84c1964c..fa1325c8dca 100644
--- a/tests/rustdoc/sidebar/top-toc-html.rs
+++ b/tests/rustdoc/sidebar/top-toc-html.rs
@@ -14,6 +14,7 @@
 
 // @has foo/index.html
 // User header
+// @has - '//section[@id="TOC"]/h3' 'Sections'
 // @has - '//section[@id="TOC"]/ul[@class="block top-toc"]/li/a[@href="#basic-link-and-emphasis"]' 'Basic link and emphasis'
 // @count - '//section[@id="TOC"]/ul[@class="block top-toc"]/li/a[@href="#basic-link-and-emphasis"]/em' 0
 // @count - '//section[@id="TOC"]/ul[@class="block top-toc"]/li/a[@href="#basic-link-and-emphasis"]/a' 0