Skip to content

Commit 46abe8a

Browse files
committed
offset_template -> sorted_template
1 parent 6780da7 commit 46abe8a

File tree

4 files changed

+72
-67
lines changed

4 files changed

+72
-67
lines changed

src/librustdoc/config.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,7 @@ impl Options {
749749
let extern_html_root_takes_precedence =
750750
matches.opt_present("extern-html-root-takes-precedence");
751751
let html_no_source = matches.opt_present("html-no-source");
752-
let MergeResult { read_rendered_cci, write_rendered_cci } = match parse_merge(matches) {
752+
let ShouldMerge { read_rendered_cci, write_rendered_cci } = match parse_merge(matches) {
753753
Ok(result) => result,
754754
Err(e) => dcx.fatal(format!("could not parse --merge: {e}")),
755755
};
@@ -939,20 +939,23 @@ impl PathToParts {
939939
}
940940
}
941941

942-
struct MergeResult {
942+
/// Controls merging of cross-crate information
943+
struct ShouldMerge {
944+
/// Should we append to existing cci in the doc root
943945
read_rendered_cci: bool,
946+
/// Should we write cci to the doc root
944947
write_rendered_cci: bool,
945948
}
946949

947950
/// Extracts read_rendered_cci and write_rendered_cci from command line arguments, or
948951
/// reports an error.
949-
fn parse_merge(matches: &getopts::Matches) -> Result<MergeResult, &'static str> {
952+
fn parse_merge(matches: &getopts::Matches) -> Result<ShouldMerge, &'static str> {
950953
match matches.opt_str("merge").as_deref() {
951954
// default = auto
952-
None => Ok(MergeResult { read_rendered_cci: true, write_rendered_cci: true }),
953-
Some("auto") => Ok(MergeResult { read_rendered_cci: true, write_rendered_cci: true }),
954-
Some("none") => Ok(MergeResult { read_rendered_cci: false, write_rendered_cci: false }),
955-
Some("write-only") => Ok(MergeResult { read_rendered_cci: false, write_rendered_cci: true }),
955+
None => Ok(ShouldMerge { read_rendered_cci: true, write_rendered_cci: true }),
956+
Some("auto") => Ok(ShouldMerge { read_rendered_cci: true, write_rendered_cci: true }),
957+
Some("none") => Ok(ShouldMerge { read_rendered_cci: false, write_rendered_cci: false }),
958+
Some("write-only") => Ok(ShouldMerge { read_rendered_cci: false, write_rendered_cci: true }),
956959
Some(_) => Err("argument to --merge must be `auto`, `none`, or `write-only`"),
957960
}
958961
}

src/librustdoc/html/render/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ mod span_map;
3535
mod type_layout;
3636
mod write_shared;
3737
mod sorted_json;
38-
mod offset_template;
38+
mod sorted_template;
3939

4040
pub(crate) use self::context::*;
4141
pub(crate) use self::span_map::{collect_spans_and_sources, LinkFromSrc};

src/librustdoc/html/render/offset_template.rs renamed to src/librustdoc/html/render/sorted_template.rs

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::fmt;
22
use std::marker::PhantomData;
3-
use rustc_data_structures::fx::FxHashSet;
3+
use std::collections::BTreeSet;
44
use std::str::FromStr;
55

66
use serde::{Serialize, Deserialize};
@@ -9,20 +9,23 @@ use serde::{Serialize, Deserialize};
99
///
1010
/// Last line of the rendered output is a comment encoding the next insertion point.
1111
#[derive(Debug, Clone)]
12-
pub(crate) struct OffsetTemplate<F> {
12+
pub(crate) struct SortedTemplate<F> {
1313
format: PhantomData<F>,
1414
before: String,
1515
after: String,
16-
contents: FxHashSet<String>,
16+
contents: BTreeSet<String>,
1717
}
1818

19+
/// Written to last line of file to specify the location of each fragment
1920
#[derive(Serialize, Deserialize, Debug, Clone)]
2021
struct Offset {
22+
/// Index of the first byte in the template
2123
start: usize,
24+
/// The length of each fragment in the encoded template, including the separator
2225
delta: Vec<usize>,
2326
}
2427

25-
impl<F> OffsetTemplate<F> {
28+
impl<F> SortedTemplate<F> {
2629
/// Generate this template from arbitary text.
2730
/// Will insert wherever the substring `magic` can be found.
2831
/// Errors if it does not appear exactly once.
@@ -40,23 +43,22 @@ impl<F> OffsetTemplate<F> {
4043
pub(crate) fn before_after<S: ToString, T: ToString>(before: S, after: T) -> Self {
4144
let before = before.to_string();
4245
let after = after.to_string();
43-
OffsetTemplate { format: PhantomData, before, after, contents: Default::default() }
46+
SortedTemplate { format: PhantomData, before, after, contents: Default::default() }
4447
}
4548
}
4649

47-
impl<F: FileFormat> OffsetTemplate<F> {
48-
/// Adds this text to the next insert point
50+
impl<F: FileFormat> SortedTemplate<F> {
51+
/// Adds this text to the template
4952
pub(crate) fn append(&mut self, insert: String) {
5053
self.contents.insert(insert);
5154
}
5255
}
5356

54-
impl<F: FileFormat> fmt::Display for OffsetTemplate<F> {
57+
impl<F: FileFormat> fmt::Display for SortedTemplate<F> {
5558
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
5659
let mut delta = Vec::default();
5760
write!(f, "{}", self.before)?;
58-
let mut contents: Vec<_> = self.contents.iter().collect();
59-
contents.sort_unstable();
61+
let contents: Vec<_> = self.contents.iter().collect();
6062
let mut sep = "";
6163
for content in contents {
6264
delta.push(sep.len() + content.len());
@@ -74,28 +76,28 @@ fn checked_split_at(s: &str, index: usize) -> Option<(&str, &str)> {
7476
s.is_char_boundary(index).then(|| s.split_at(index))
7577
}
7678

77-
impl<F: FileFormat> FromStr for OffsetTemplate<F> {
79+
impl<F: FileFormat> FromStr for SortedTemplate<F> {
7880
type Err = Error;
7981
fn from_str(s: &str) -> Result<Self, Self::Err> {
8082
let (s, offset) = s.rsplit_once("\n").ok_or(Error)?;
8183
let offset = offset.strip_prefix(F::COMMENT_START).ok_or(Error)?;
8284
let offset = offset.strip_suffix(F::COMMENT_END).ok_or(Error)?;
8385
let offset: Offset = serde_json::from_str(&offset).map_err(|_| Error)?;
8486
let (before, mut s) = checked_split_at(s, offset.start).ok_or(Error)?;
85-
let mut contents = Vec::default();
87+
let mut contents = BTreeSet::default();
8688
let mut sep = "";
8789
for &index in offset.delta.iter() {
8890
let (content, rest) = checked_split_at(s, index).ok_or(Error)?;
8991
s = rest;
9092
let content = content.strip_prefix(sep).ok_or(Error)?;
91-
contents.push(content);
93+
contents.insert(content.to_string());
9294
sep = F::SEPARATOR;
9395
}
94-
Ok(OffsetTemplate {
96+
Ok(SortedTemplate {
9597
format: PhantomData,
9698
before: before.to_string(),
9799
after: s.to_string(),
98-
contents: contents.into_iter().map(ToString::to_string).collect(),
100+
contents,
99101
})
100102
}
101103
}
@@ -142,21 +144,21 @@ mod tests {
142144
s.starts_with("//")
143145
}
144146

145-
/// not correct, but good enough for these tests
146147
fn is_comment_html(s: &str) -> bool {
148+
// not correct but good enough for these tests
147149
s.starts_with("<!--") && s.ends_with("-->")
148150
}
149151

150152
#[test]
151153
fn html_from_empty() {
152-
let inserts = ["<p>hello</p>", "<p>kind</p>", "<p>world</p>"];
153-
let mut template = OffsetTemplate::<Html>::before_after("", "");
154+
let inserts = ["<p>hello</p>", "<p>kind</p>", "<p>hello</p>", "<p>world</p>"];
155+
let mut template = SortedTemplate::<Html>::before_after("", "");
154156
for insert in inserts {
155157
template.append(insert.to_string());
156158
}
157159
let template = format!("{template}");
158160
let (template, end) = template.rsplit_once("\n").unwrap();
159-
assert_eq!(template, inserts.join(""));
161+
assert_eq!(template, "<p>hello</p><p>kind</p><p>world</p>");
160162
assert!(is_comment_html(end));
161163
assert!(!end.contains("\n"));
162164
}
@@ -166,7 +168,7 @@ mod tests {
166168
let inserts = ["<p>hello</p>", "<p>kind</p>", "<p>world</p>"];
167169
let before = "<html><head></head><body>";
168170
let after = "</body>";
169-
let mut template = OffsetTemplate::<Html>::before_after(before, after);
171+
let mut template = SortedTemplate::<Html>::before_after(before, after);
170172
for insert in inserts {
171173
template.append(insert.to_string());
172174
}
@@ -179,21 +181,21 @@ mod tests {
179181

180182
#[test]
181183
fn js_from_empty() {
182-
let inserts = ["1", "2", "3"];
183-
let mut template = OffsetTemplate::<Js>::before_after("", "");
184+
let inserts = ["1", "2", "2", "2", "3", "1"];
185+
let mut template = SortedTemplate::<Js>::before_after("", "");
184186
for insert in inserts {
185187
template.append(insert.to_string());
186188
}
187189
let template = format!("{template}");
188190
let (template, end) = template.rsplit_once("\n").unwrap();
189-
assert_eq!(template, inserts.join(","));
191+
assert_eq!(template, "1,2,3");
190192
assert!(is_comment_js(end));
191193
assert!(!end.contains("\n"));
192194
}
193195

194196
#[test]
195197
fn js_empty_array() {
196-
let template = OffsetTemplate::<Js>::before_after("[", "]");
198+
let template = SortedTemplate::<Js>::before_after("[", "]");
197199
let template = format!("{template}");
198200
let (template, end) = template.rsplit_once("\n").unwrap();
199201
assert_eq!(template, format!("[]"));
@@ -204,7 +206,7 @@ mod tests {
204206
#[test]
205207
fn js_number_array() {
206208
let inserts = ["1", "2", "3"];
207-
let mut template = OffsetTemplate::<Js>::before_after("[", "]");
209+
let mut template = SortedTemplate::<Js>::before_after("[", "]");
208210
for insert in inserts {
209211
template.append(insert.to_string());
210212
}
@@ -217,8 +219,8 @@ mod tests {
217219

218220
#[test]
219221
fn magic_js_number_array() {
220-
let inserts = ["1"];
221-
let mut template = OffsetTemplate::<Js>::magic("[#]", "#").unwrap();
222+
let inserts = ["1", "1"];
223+
let mut template = SortedTemplate::<Js>::magic("[#]", "#").unwrap();
222224
for insert in inserts {
223225
template.append(insert.to_string());
224226
}
@@ -232,12 +234,12 @@ mod tests {
232234
#[test]
233235
fn round_trip_js() {
234236
let inserts = ["1", "2", "3"];
235-
let mut template = OffsetTemplate::<Js>::before_after("[", "]");
237+
let mut template = SortedTemplate::<Js>::before_after("[", "]");
236238
for insert in inserts {
237239
template.append(insert.to_string());
238240
}
239241
let template1 = format!("{template}");
240-
let mut template = OffsetTemplate::<Js>::from_str(&template1).unwrap();
242+
let mut template = SortedTemplate::<Js>::from_str(&template1).unwrap();
241243
assert_eq!(template1, format!("{template}"));
242244
template.append("4".to_string());
243245
let template = format!("{template}");
@@ -248,34 +250,34 @@ mod tests {
248250

249251
#[test]
250252
fn round_trip_html() {
251-
let inserts = ["<p>hello</p>", "<p>kind</p>", "<p>world</p>"];
253+
let inserts = ["<p>hello</p>", "<p>kind</p>", "<p>world</p>", "<p>kind</p>"];
252254
let before = "<html><head></head><body>";
253255
let after = "</body>";
254-
let mut template = OffsetTemplate::<Html>::before_after(before, after);
256+
let mut template = SortedTemplate::<Html>::before_after(before, after);
255257
template.append(inserts[0].to_string());
256258
template.append(inserts[1].to_string());
257259
let template = format!("{template}");
258-
let mut template = OffsetTemplate::<Html>::from_str(&template).unwrap();
260+
let mut template = SortedTemplate::<Html>::from_str(&template).unwrap();
259261
template.append(inserts[2].to_string());
260262
let template = format!("{template}");
261263
let (template, end) = template.rsplit_once("\n").unwrap();
262-
assert_eq!(template, format!("{before}{}{after}", inserts.join("")));
264+
assert_eq!(template, format!("{before}<p>hello</p><p>kind</p><p>world</p>{after}"));
263265
assert!(is_comment_html(end));
264266
}
265267

266268
#[test]
267269
fn blank_js() {
268270
let inserts = ["1", "2", "3"];
269-
let mut template = OffsetTemplate::<Js>::before_after("", "");
271+
let template = SortedTemplate::<Js>::before_after("", "");
270272
let template = format!("{template}");
271273
let (t, _) = template.rsplit_once("\n").unwrap();
272274
assert_eq!(t, "");
273-
let mut template = OffsetTemplate::<Js>::from_str(&template).unwrap();
275+
let mut template = SortedTemplate::<Js>::from_str(&template).unwrap();
274276
for insert in inserts {
275277
template.append(insert.to_string());
276278
}
277279
let template1 = format!("{template}");
278-
let mut template = OffsetTemplate::<Js>::from_str(&template1).unwrap();
280+
let mut template = SortedTemplate::<Js>::from_str(&template1).unwrap();
279281
assert_eq!(template1, format!("{template}"));
280282
template.append("4".to_string());
281283
let template = format!("{template}");

0 commit comments

Comments
 (0)