address review comment
https://github.com/rust-lang/rustc-dev-guide/pull/1394#discussion_r934018981 Much more clean
This commit is contained in:
parent
ade29246e2
commit
2a5b586c24
|
|
@ -36,52 +36,51 @@ impl fmt::Display for Date {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_date_regex() -> Vec<Regex> {
|
fn make_date_regex() -> Regex {
|
||||||
Vec::from([
|
Regex::new(
|
||||||
Regex::new(r"<!--\s+date-check:\s+(\D+)\s+(\d{4})\s+-->").unwrap(),
|
r"(?x)
|
||||||
Regex::new(r"<!--\s+date-check\s+-->\s+(\D+)\s+(\d{4})\b").unwrap(),
|
(?:<!--\s+date-check:\s+(\D+)\s+(\d{4})\s+-->)|
|
||||||
])
|
(?:<!--\s+date-check\s+-->\s+(\D+)\s+(\d{4})\b)
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn collect_dates_from_file(date_regexes: &[Regex], text: &str) -> Vec<(usize, Date)> {
|
fn collect_dates_from_file(date_regex: &Regex, text: &str) -> Vec<(usize, Date)> {
|
||||||
let mut output = Vec::new();
|
let mut line = 1;
|
||||||
for date_regex in date_regexes {
|
let mut end_of_last_cap = 0;
|
||||||
let mut line = 1;
|
date_regex
|
||||||
let mut end_of_last_cap = 0;
|
.captures_iter(text)
|
||||||
let results: Vec<_> = date_regex
|
.filter_map(|cap| {
|
||||||
.captures_iter(text)
|
if let (Some(month), Some(year), None, None) | (None, None, Some(month), Some(year)) =
|
||||||
.filter_map(|cap| {
|
(cap.get(1), cap.get(2), cap.get(3), cap.get(4))
|
||||||
if let (Some(year), Some(month)) = (cap.get(2), cap.get(1)) {
|
{
|
||||||
let year = year.as_str().parse().expect("year");
|
let year = year.as_str().parse().expect("year");
|
||||||
let month = Month::from_str(month.as_str())
|
let month = Month::from_str(month.as_str())
|
||||||
.expect("month")
|
.expect("month")
|
||||||
.number_from_month();
|
.number_from_month();
|
||||||
Some((cap.get(0).expect("all").range(), Date { year, month }))
|
Some((cap.get(0).expect("all").range(), Date { year, month }))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.map(|(byte_range, date)| {
|
.map(|(byte_range, date)| {
|
||||||
line += text[end_of_last_cap..byte_range.end]
|
line += text[end_of_last_cap..byte_range.end]
|
||||||
.chars()
|
.chars()
|
||||||
.filter(|c| *c == '\n')
|
.filter(|c| *c == '\n')
|
||||||
.count();
|
.count();
|
||||||
end_of_last_cap = byte_range.end;
|
end_of_last_cap = byte_range.end;
|
||||||
(line, date)
|
(line, date)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect()
|
||||||
output.extend(results);
|
|
||||||
}
|
|
||||||
output.sort_by_key(|a| a.0);
|
|
||||||
output
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn collect_dates(paths: impl Iterator<Item = PathBuf>) -> BTreeMap<PathBuf, Vec<(usize, Date)>> {
|
fn collect_dates(paths: impl Iterator<Item = PathBuf>) -> BTreeMap<PathBuf, Vec<(usize, Date)>> {
|
||||||
let date_regexes = make_date_regex();
|
let date_regex = make_date_regex();
|
||||||
let mut data = BTreeMap::new();
|
let mut data = BTreeMap::new();
|
||||||
for path in paths {
|
for path in paths {
|
||||||
let text = fs::read_to_string(&path).unwrap();
|
let text = fs::read_to_string(&path).unwrap();
|
||||||
let dates = collect_dates_from_file(&date_regexes, &text);
|
let dates = collect_dates_from_file(&date_regex, &text);
|
||||||
if !dates.is_empty() {
|
if !dates.is_empty() {
|
||||||
data.insert(path, dates);
|
data.insert(path, dates);
|
||||||
}
|
}
|
||||||
|
|
@ -185,29 +184,29 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_date_regex() {
|
fn test_date_regex() {
|
||||||
let regexes = &make_date_regex();
|
let regex = &make_date_regex();
|
||||||
assert!(regexes[0].is_match("<!-- date-check: jan 2021 -->"));
|
assert!(regex.is_match("<!-- date-check: jan 2021 -->"));
|
||||||
assert!(regexes[0].is_match("<!-- date-check: january 2021 -->"));
|
assert!(regex.is_match("<!-- date-check: january 2021 -->"));
|
||||||
assert!(regexes[0].is_match("<!-- date-check: Jan 2021 -->"));
|
assert!(regex.is_match("<!-- date-check: Jan 2021 -->"));
|
||||||
assert!(regexes[0].is_match("<!-- date-check: January 2021 -->"));
|
assert!(regex.is_match("<!-- date-check: January 2021 -->"));
|
||||||
assert!(regexes[1].is_match("<!-- date-check --> jan 2021"));
|
assert!(regex.is_match("<!-- date-check --> jan 2021"));
|
||||||
assert!(regexes[1].is_match("<!-- date-check --> january 2021"));
|
assert!(regex.is_match("<!-- date-check --> january 2021"));
|
||||||
assert!(regexes[1].is_match("<!-- date-check --> Jan 2021"));
|
assert!(regex.is_match("<!-- date-check --> Jan 2021"));
|
||||||
assert!(regexes[1].is_match("<!-- date-check --> January 2021"));
|
assert!(regex.is_match("<!-- date-check --> January 2021"));
|
||||||
|
|
||||||
assert!(regexes[1].is_match("<!-- date-check --> jan 2021 "));
|
assert!(regex.is_match("<!-- date-check --> jan 2021 "));
|
||||||
assert!(regexes[1].is_match("<!-- date-check --> jan 2021."));
|
assert!(regex.is_match("<!-- date-check --> jan 2021."));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_date_regex_fail() {
|
fn test_date_regex_fail() {
|
||||||
let regexes = &make_date_regex();
|
let regexes = &make_date_regex();
|
||||||
assert!(!regexes[0].is_match("<!-- date-check: jan 221 -->"));
|
assert!(!regexes.is_match("<!-- date-check: jan 221 -->"));
|
||||||
assert!(!regexes[0].is_match("<!-- date-check: jan 20221 -->"));
|
assert!(!regexes.is_match("<!-- date-check: jan 20221 -->"));
|
||||||
assert!(!regexes[0].is_match("<!-- date-check: 01 2021 -->"));
|
assert!(!regexes.is_match("<!-- date-check: 01 2021 -->"));
|
||||||
assert!(!regexes[1].is_match("<!-- date-check --> jan 221"));
|
assert!(!regexes.is_match("<!-- date-check --> jan 221"));
|
||||||
assert!(!regexes[1].is_match("<!-- date-check --> jan 20222"));
|
assert!(!regexes.is_match("<!-- date-check --> jan 20222"));
|
||||||
assert!(!regexes[1].is_match("<!-- date-check --> 01 2021"));
|
assert!(!regexes.is_match("<!-- date-check --> 01 2021"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue