about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-02-05 06:37:17 +0100
committerGitHub <noreply@github.com>2024-02-05 06:37:17 +0100
commita2d3eed58dfedd7b9e3870c88efa1208e4994f40 (patch)
tree6d7bbdb48661324fa30bd32660605f1ad28c96c8
parentbc98f5795b0c78f1e2f4b9a4497b962fb29ad836 (diff)
parentcb4e69ad67cd795ffcff18494c41d2f13c26904f (diff)
downloadrust-a2d3eed58dfedd7b9e3870c88efa1208e4994f40.tar.gz
rust-a2d3eed58dfedd7b9e3870c88efa1208e4994f40.zip
Rollup merge of #120641 - klensy:copypaste-me, r=notriddle
rustdoc: trait.impl, type.impl: sort impls to make it not depend on serialization order

Can be tested by running `cargo doc` with different rust versions on some crate and comparing `doc` folders: files in `trait.impl` and `type.impl` will sometimes have different order of impls.
-rw-r--r--src/librustdoc/html/render/write_shared.rs31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/librustdoc/html/render/write_shared.rs b/src/librustdoc/html/render/write_shared.rs
index 6408e97df50..fbd45b2b48e 100644
--- a/src/librustdoc/html/render/write_shared.rs
+++ b/src/librustdoc/html/render/write_shared.rs
@@ -593,11 +593,17 @@ else if (window.initSearch) window.initSearch(searchIndex);
                 ret
             })
             .collect::<Vec<_>>();
-        let impls = format!(
-            r#""{}":{}"#,
-            krate.name(cx.tcx()),
-            serde_json::to_string(&impls).expect("failed serde conversion"),
-        );
+
+        // FIXME: this fixes only rustdoc part of instability of trait impls
+        // for js files, see #120371
+        // Manually collect to string and sort to make list not depend on order
+        let mut impls = impls
+            .iter()
+            .map(|i| serde_json::to_string(i).expect("failed serde conversion"))
+            .collect::<Vec<_>>();
+        impls.sort();
+
+        let impls = format!(r#""{}":[{}]"#, krate.name(cx.tcx()), impls.join(","));
 
         let mut mydst = dst.clone();
         for part in &aliased_type.target_fqp[..aliased_type.target_fqp.len() - 1] {
@@ -702,11 +708,16 @@ else if (window.initSearch) window.initSearch(searchIndex);
             continue;
         }
 
-        let implementors = format!(
-            r#""{}":{}"#,
-            krate.name(cx.tcx()),
-            serde_json::to_string(&implementors).expect("failed serde conversion"),
-        );
+        // FIXME: this fixes only rustdoc part of instability of trait impls
+        // for js files, see #120371
+        // Manually collect to string and sort to make list not depend on order
+        let mut implementors = implementors
+            .iter()
+            .map(|i| serde_json::to_string(i).expect("failed serde conversion"))
+            .collect::<Vec<_>>();
+        implementors.sort();
+
+        let implementors = format!(r#""{}":[{}]"#, krate.name(cx.tcx()), implementors.join(","));
 
         let mut mydst = dst.clone();
         for part in &remote_path[..remote_path.len() - 1] {