Update tidy check for error codes testing
This commit is contained in:
parent
9b0214d9c5
commit
df9fed17ed
1 changed files with 50 additions and 20 deletions
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
use std::collections::HashMap;
|
||||
use std::ffi::OsStr;
|
||||
use std::fs::read_to_string;
|
||||
use std::io::Read;
|
||||
use std::path::Path;
|
||||
|
||||
// A few of those error codes can't be tested but all the others can and *should* be tested!
|
||||
|
|
@ -50,29 +52,60 @@ const WHITELIST: &[&str] = &[
|
|||
"E0729",
|
||||
];
|
||||
|
||||
fn extract_error_codes(f: &str, error_codes: &mut HashMap<String, bool>) {
|
||||
fn check_error_code_explanation(
|
||||
f: &str,
|
||||
error_codes: &mut HashMap<String, bool>,
|
||||
err_code: String,
|
||||
) {
|
||||
for line in f.lines() {
|
||||
let s = line.trim();
|
||||
if s.starts_with("```") && s.contains("compile_fail") && s.contains('E') {
|
||||
error_codes.insert(err_code, true);
|
||||
return;
|
||||
} else if s.starts_with("#### Note: this error code is no longer emitted by the compiler") {
|
||||
error_codes.get_mut(&err_code).map(|x| *x = true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! some_or_continue {
|
||||
($e:expr) => (
|
||||
match $e {
|
||||
Some(e) => e,
|
||||
None => continue,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
fn extract_error_codes(f: &str, error_codes: &mut HashMap<String, bool>, path: &Path) {
|
||||
let mut reached_no_explanation = false;
|
||||
let mut last_error_code = None;
|
||||
|
||||
for line in f.lines() {
|
||||
let s = line.trim();
|
||||
if s.starts_with('E') && s.ends_with(": r##\"") {
|
||||
if !reached_no_explanation && s.starts_with('E') && s.contains("include_str!(\"") {
|
||||
if let Some(err_code) = s.splitn(2, ':').next() {
|
||||
let err_code = err_code.to_owned();
|
||||
last_error_code = Some(err_code.clone());
|
||||
if !error_codes.contains_key(&err_code) {
|
||||
error_codes.insert(err_code, false);
|
||||
error_codes.insert(err_code.clone(), false);
|
||||
}
|
||||
// Now we extract the tests from the markdown file!
|
||||
let md = some_or_continue!(s.splitn(2, "include_str!(\"").skip(1).next());
|
||||
let md_file_name = some_or_continue!(md.splitn(2, "\")").next());
|
||||
let path = some_or_continue!(path.parent()).join(md_file_name);
|
||||
match read_to_string(&path) {
|
||||
Ok(content) => {
|
||||
check_error_code_explanation(
|
||||
&content,
|
||||
error_codes,
|
||||
err_code,
|
||||
);
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("Couldn't read `{}`: {}", path.display(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if s.starts_with("```") && s.contains("compile_fail") && s.contains('E') {
|
||||
if let Some(err_code) = s.splitn(2, 'E').skip(1).next() {
|
||||
if let Some(err_code) = err_code.splitn(2, ',').next() {
|
||||
let nb = error_codes.entry(format!("E{}", err_code)).or_insert(false);
|
||||
*nb = true;
|
||||
}
|
||||
}
|
||||
} else if s == ";" {
|
||||
reached_no_explanation = true;
|
||||
} else if reached_no_explanation && s.starts_with('E') {
|
||||
if let Some(err_code) = s.splitn(2, ',').next() {
|
||||
let err_code = err_code.to_owned();
|
||||
|
|
@ -80,11 +113,8 @@ fn extract_error_codes(f: &str, error_codes: &mut HashMap<String, bool>) {
|
|||
error_codes.insert(err_code, false);
|
||||
}
|
||||
}
|
||||
} else if s.starts_with("#### Note: this error code is no longer emitted by the compiler") {
|
||||
if let Some(last) = last_error_code {
|
||||
error_codes.get_mut(&last).map(|x| *x = true);
|
||||
}
|
||||
last_error_code = None;
|
||||
} else if s == ";" {
|
||||
reached_no_explanation = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -111,7 +141,7 @@ pub fn check(path: &Path, bad: &mut bool) {
|
|||
&mut |entry, contents| {
|
||||
let file_name = entry.file_name();
|
||||
if file_name == "error_codes.rs" {
|
||||
extract_error_codes(contents, &mut error_codes);
|
||||
extract_error_codes(contents, &mut error_codes, entry.path());
|
||||
} else if entry.path().extension() == Some(OsStr::new("stderr")) {
|
||||
extract_error_codes_from_tests(contents, &mut error_codes);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue