diff --git a/src/librustdoc/html/render/ordered_json.rs b/src/librustdoc/html/render/ordered_json.rs
index d1dddfebc83a2..f7995344a1382 100644
--- a/src/librustdoc/html/render/ordered_json.rs
+++ b/src/librustdoc/html/render/ordered_json.rs
@@ -32,6 +32,10 @@ impl OrderedJson {
let items = items.into_iter().format_with(",", |item, f| f(item.borrow()));
Self(format!("[{items}]"))
}
+
+ pub(crate) fn array_builder() -> OrderedJsonBuilder {
+ OrderedJsonBuilder::default()
+ }
}
impl fmt::Display for OrderedJson {
@@ -79,5 +83,32 @@ impl fmt::Display for EscapedJson {
}
}
+/// Builds an json array.
+#[derive(Default)]
+pub(crate) struct OrderedJsonBuilder {
+ partial: Vec,
+}
+
+impl OrderedJsonBuilder {
+ pub(crate) fn push(&mut self, item: impl Serialize) -> &mut Self {
+ if self.partial.is_empty() {
+ self.partial.push(b'[');
+ } else {
+ self.partial.push(b',');
+ }
+ serde_json::to_writer(&mut self.partial, &item).expect("serialization failed");
+ self
+ }
+
+ pub(crate) fn build(&mut self) -> OrderedJson {
+ let mut out = std::mem::take(&mut self.partial);
+ if out.is_empty() {
+ return OrderedJson("[]".to_string());
+ }
+ out.push(b']');
+ OrderedJson(String::from_utf8(out).expect("serialization bug: json is invalid utf8"))
+ }
+}
+
#[cfg(test)]
mod tests;
diff --git a/src/librustdoc/html/render/search_index.rs b/src/librustdoc/html/render/search_index.rs
index aff8684ee3a09..36b59dce6b035 100644
--- a/src/librustdoc/html/render/search_index.rs
+++ b/src/librustdoc/html/render/search_index.rs
@@ -796,10 +796,8 @@ pub(crate) fn build_index(
desc_index,
empty_desc,
};
- let index = OrderedJson::array_unsorted([
- OrderedJson::serialize(crate_name.as_str()).unwrap(),
- OrderedJson::serialize(data).unwrap(),
- ]);
+
+ let index = OrderedJson::array_builder().push(crate_name.as_str()).push(data).build();
SerializedSearchIndex { index, desc }
}
diff --git a/src/librustdoc/html/static/js/rustdoc.d.ts b/src/librustdoc/html/static/js/rustdoc.d.ts
index 0d2e19e019f34..8be45079aaece 100644
--- a/src/librustdoc/html/static/js/rustdoc.d.ts
+++ b/src/librustdoc/html/static/js/rustdoc.d.ts
@@ -129,7 +129,7 @@ declare namespace rustdoc {
/**
* A single parsed "atom" in a search query. For example,
- *
+ *
* std::fmt::Formatter, Write -> Result<()>
* ┏━━━━━━━━━━━━━━━━━━ ┌──── ┏━━━━━┅┅┅┅┄┄┄┄┄┄┄┄┄┄┄┄┄┄┐
* ┃ │ ┗ QueryElement { ┊