Skip to content

Commit eebd026

Browse files
Migrate top-level rendering to Buffer
1 parent f35eae9 commit eebd026

File tree

3 files changed

+49
-52
lines changed

3 files changed

+49
-52
lines changed

src/librustdoc/html/layout.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use std::fmt;
2-
use std::io;
32
use std::path::PathBuf;
43

54
use crate::externalfiles::ExternalHtml;
65
use crate::html::render::SlashChecker;
6+
use crate::html::format::Buffer;
77

88
#[derive(Clone)]
99
pub struct Layout {
@@ -26,15 +26,15 @@ pub struct Page<'a> {
2626
}
2727

2828
pub fn render<T: fmt::Display, S: fmt::Display>(
29-
dst: &mut dyn io::Write,
29+
dst: &mut Buffer,
3030
layout: &Layout,
3131
page: &Page<'_>,
3232
sidebar: &S,
3333
t: &T,
3434
css_file_extension: bool,
3535
themes: &[PathBuf],
3636
generate_search_filter: bool,
37-
) -> io::Result<()> {
37+
) {
3838
let static_root_path = page.static_root_path.unwrap_or(page.root_path);
3939
write!(dst,
4040
"<!DOCTYPE html>\
@@ -238,7 +238,7 @@ pub fn render<T: fmt::Display, S: fmt::Display>(
238238
)
239239
}
240240

241-
pub fn redirect(dst: &mut dyn io::Write, url: &str) -> io::Result<()> {
241+
pub fn redirect(dst: &mut Buffer, url: &str) {
242242
// <script> triggers a redirect before refresh, so this is fine.
243243
write!(dst,
244244
r##"<!DOCTYPE html>

src/librustdoc/html/render.rs

Lines changed: 41 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ use crate::docfs::{DocFS, ErrorStorage, PathError};
6565
use crate::doctree;
6666
use crate::fold::DocFolder;
6767
use crate::html::escape::Escape;
68-
use crate::html::format::{AsyncSpace, ConstnessSpace};
68+
use crate::html::format::{Buffer, AsyncSpace, ConstnessSpace};
6969
use crate::html::format::{GenericBounds, WhereClause, href, AbiSpace, DefaultSpace};
7070
use crate::html::format::{VisSpace, Function, UnsafetySpace, MutableSpace};
7171
use crate::html::format::fmt_impl_for_trait_page;
@@ -1185,13 +1185,13 @@ themePicker.onblur = handleThemeButtonsBlur;
11851185
SlashChecker(s), s)
11861186
})
11871187
.collect::<String>());
1188-
let mut v = Vec::new();
1189-
try_err!(layout::render(&mut v, &cx.shared.layout,
1190-
&page, &(""), &content,
1191-
cx.shared.css_file_extension.is_some(),
1192-
&cx.shared.themes,
1193-
cx.shared.generate_search_filter), &dst);
1194-
cx.shared.fs.write(&dst, &v)?;
1188+
let mut v = Buffer::html();
1189+
layout::render(&mut v, &cx.shared.layout,
1190+
&page, &(""), &content,
1191+
cx.shared.css_file_extension.is_some(),
1192+
&cx.shared.themes,
1193+
cx.shared.generate_search_filter);
1194+
cx.shared.fs.write(&dst, v.into_inner().as_bytes())?;
11951195
}
11961196
}
11971197

@@ -1939,14 +1939,13 @@ impl Context {
19391939
} else {
19401940
String::new()
19411941
};
1942-
let mut v = Vec::new();
1943-
try_err!(layout::render(&mut v, &self.shared.layout,
1944-
&page, &sidebar, &all,
1945-
self.shared.css_file_extension.is_some(),
1946-
&self.shared.themes,
1947-
self.shared.generate_search_filter),
1948-
&final_file);
1949-
self.shared.fs.write(&final_file, &v)?;
1942+
let mut v = Buffer::html();
1943+
layout::render(&mut v, &self.shared.layout,
1944+
&page, &sidebar, &all,
1945+
self.shared.css_file_extension.is_some(),
1946+
&self.shared.themes,
1947+
self.shared.generate_search_filter);
1948+
self.shared.fs.write(&final_file, v.into_inner().as_bytes())?;
19501949

19511950
// Generating settings page.
19521951
let settings = Settings::new(self.shared.static_root_path.as_deref().unwrap_or("./"),
@@ -1959,23 +1958,24 @@ impl Context {
19591958
let sidebar = "<p class='location'>Settings</p><div class='sidebar-elems'></div>";
19601959
themes.push(PathBuf::from("settings.css"));
19611960
let layout = self.shared.layout.clone();
1962-
let mut v = Vec::new();
1963-
try_err!(layout::render(&mut v, &layout,
1964-
&page, &sidebar, &settings,
1965-
self.shared.css_file_extension.is_some(),
1966-
&themes,
1967-
self.shared.generate_search_filter),
1968-
&settings_file);
1969-
self.shared.fs.write(&settings_file, &v)?;
1961+
let mut v = Buffer::html();
1962+
layout::render(
1963+
&mut v,
1964+
&layout,
1965+
&page, &sidebar, &settings,
1966+
self.shared.css_file_extension.is_some(),
1967+
&themes,
1968+
self.shared.generate_search_filter,
1969+
);
1970+
self.shared.fs.write(&settings_file, v.into_inner().as_bytes())?;
19701971

19711972
Ok(())
19721973
}
19731974

19741975
fn render_item(&self,
1975-
writer: &mut dyn io::Write,
1976+
writer: &mut Buffer,
19761977
it: &clean::Item,
1977-
pushname: bool)
1978-
-> io::Result<()> {
1978+
pushname: bool) {
19791979
// A little unfortunate that this is done like this, but it sure
19801980
// does make formatting *a lot* nicer.
19811981
CURRENT_DEPTH.with(|slot| {
@@ -2027,7 +2027,7 @@ impl Context {
20272027
&Item{ cx: self, item: it },
20282028
self.shared.css_file_extension.is_some(),
20292029
&self.shared.themes,
2030-
self.shared.generate_search_filter)?;
2030+
self.shared.generate_search_filter);
20312031
} else {
20322032
let mut url = self.root_path();
20332033
if let Some(&(ref names, ty)) = cache().paths.get(&it.def_id) {
@@ -2036,10 +2036,9 @@ impl Context {
20362036
url.push_str("/");
20372037
}
20382038
url.push_str(&item_path(ty, names.last().unwrap()));
2039-
layout::redirect(writer, &url)?;
2039+
layout::redirect(writer, &url);
20402040
}
20412041
}
2042-
Ok(())
20432042
}
20442043

20452044
/// Non-parallelized version of rendering an item. This will take the input
@@ -2075,13 +2074,13 @@ impl Context {
20752074

20762075
info!("Recursing into {}", self.dst.display());
20772076

2078-
let mut buf = Vec::new();
2079-
self.render_item(&mut buf, &item, false).unwrap();
2077+
let mut buf = Buffer::html();
2078+
self.render_item(&mut buf, &item, false);
20802079
// buf will be empty if the module is stripped and there is no redirect for it
20812080
if !buf.is_empty() {
20822081
self.shared.ensure_dir(&self.dst)?;
20832082
let joint_dst = self.dst.join("index.html");
2084-
scx.fs.write(&joint_dst, buf)?;
2083+
scx.fs.write(&joint_dst, buf.into_inner().as_bytes())?;
20852084
}
20862085

20872086
let m = match item.inner {
@@ -2110,16 +2109,16 @@ impl Context {
21102109
self.dst = prev;
21112110
self.current.pop().unwrap();
21122111
} else if item.name.is_some() {
2113-
let mut buf = Vec::new();
2114-
self.render_item(&mut buf, &item, true).unwrap();
2112+
let mut buf = Buffer::html();
2113+
self.render_item(&mut buf, &item, true);
21152114
// buf will be empty if the item is stripped and there is no redirect for it
21162115
if !buf.is_empty() {
21172116
let name = item.name.as_ref().unwrap();
21182117
let item_type = item.type_();
21192118
let file_name = &item_path(item_type, name);
21202119
self.shared.ensure_dir(&self.dst)?;
21212120
let joint_dst = self.dst.join(file_name);
2122-
self.shared.fs.write(&joint_dst, buf)?;
2121+
self.shared.fs.write(&joint_dst, buf.into_inner().as_bytes())?;
21232122

21242123
if !self.render_redirect_pages {
21252124
all.append(full_path(self, &item), &item_type);
@@ -2129,18 +2128,18 @@ impl Context {
21292128
// URL for the page.
21302129
let redir_name = format!("{}.{}.html", name, item_type.name_space());
21312130
let redir_dst = self.dst.join(redir_name);
2132-
let mut v = Vec::new();
2133-
try_err!(layout::redirect(&mut v, file_name), &redir_dst);
2134-
self.shared.fs.write(&redir_dst, &v)?;
2131+
let mut v = Buffer::html();
2132+
layout::redirect(&mut v, file_name);
2133+
self.shared.fs.write(&redir_dst, v.into_inner().as_bytes())?;
21352134
}
21362135
// If the item is a macro, redirect from the old macro URL (with !)
21372136
// to the new one (without).
21382137
if item_type == ItemType::Macro {
21392138
let redir_name = format!("{}.{}!.html", item_type, name);
21402139
let redir_dst = self.dst.join(redir_name);
2141-
let mut v = Vec::new();
2142-
try_err!(layout::redirect(&mut v, file_name), &redir_dst);
2143-
self.shared.fs.write(&redir_dst, &v)?;
2140+
let mut v = Buffer::html();
2141+
layout::redirect(&mut v, file_name);
2142+
self.shared.fs.write(&redir_dst, v.into_inner().as_bytes())?;
21442143
}
21452144
}
21462145
}

src/librustdoc/html/sources.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::fold::DocFolder;
44
use crate::html::layout;
55
use crate::html::render::{Error, SharedContext, BASIC_KEYWORDS};
66
use crate::html::highlight;
7+
use crate::html::format::Buffer;
78
use std::ffi::OsStr;
89
use std::fs;
910
use std::path::{Component, Path, PathBuf};
@@ -105,7 +106,7 @@ impl<'a> SourceCollector<'a> {
105106
cur.push(&fname);
106107
href.push_str(&fname.to_string_lossy());
107108

108-
let mut v = Vec::new();
109+
let mut v = Buffer::html();
109110
let title = format!("{} -- source", cur.file_name().expect("failed to get file name")
110111
.to_string_lossy());
111112
let desc = format!("Source to the Rust file `{}`.", filename);
@@ -120,15 +121,12 @@ impl<'a> SourceCollector<'a> {
120121
extra_scripts: &[&format!("source-files{}", self.scx.resource_suffix)],
121122
static_extra_scripts: &[&format!("source-script{}", self.scx.resource_suffix)],
122123
};
123-
let result = layout::render(&mut v, &self.scx.layout,
124+
layout::render(&mut v, &self.scx.layout,
124125
&page, &(""), &Source(contents),
125126
self.scx.css_file_extension.is_some(),
126127
&self.scx.themes,
127128
self.scx.generate_search_filter);
128-
if let Err(e) = result {
129-
return Err(Error::new(e, &cur));
130-
}
131-
self.scx.fs.write(&cur, &v)?;
129+
self.scx.fs.write(&cur, v.into_inner().as_bytes())?;
132130
self.scx.local_sources.insert(p.clone(), href);
133131
Ok(())
134132
}

0 commit comments

Comments
 (0)