Auto merge of #32341 - frewsxcv:compiletest-enum, r=nikomatsakis
Use enum for message kind in compiletest harness. None
This commit is contained in:
commit
c7bdfd4442
2 changed files with 57 additions and 14 deletions
|
@ -9,14 +9,54 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
use self::WhichLine::*;
|
use self::WhichLine::*;
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
|
pub enum ErrorKind {
|
||||||
|
Help,
|
||||||
|
Error,
|
||||||
|
Note,
|
||||||
|
Suggestion,
|
||||||
|
Warning,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for ErrorKind {
|
||||||
|
type Err = ();
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match &s.trim_right_matches(':') as &str {
|
||||||
|
"HELP" => Ok(ErrorKind::Help),
|
||||||
|
"ERROR" => Ok(ErrorKind::Error),
|
||||||
|
"NOTE" => Ok(ErrorKind::Note),
|
||||||
|
"SUGGESTION" => Ok(ErrorKind::Suggestion),
|
||||||
|
"WARN" => Ok(ErrorKind::Warning),
|
||||||
|
"WARNING" => Ok(ErrorKind::Warning),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for ErrorKind {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match *self {
|
||||||
|
ErrorKind::Help => write!(f, "help"),
|
||||||
|
ErrorKind::Error => write!(f, "error"),
|
||||||
|
ErrorKind::Note => write!(f, "note"),
|
||||||
|
ErrorKind::Suggestion => write!(f, "suggestion"),
|
||||||
|
ErrorKind::Warning => write!(f, "warning"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct ExpectedError {
|
pub struct ExpectedError {
|
||||||
pub line_num: usize,
|
pub line_num: usize,
|
||||||
pub kind: String,
|
/// What kind of message we expect (e.g. warning, error, suggestion).
|
||||||
|
/// `None` if not specified or unknown message kind.
|
||||||
|
pub kind: Option<ErrorKind>,
|
||||||
pub msg: String,
|
pub msg: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,11 +121,11 @@ fn parse_expected(last_nonfollow_error: Option<usize>,
|
||||||
(false, line[start + tag.len()..].chars().take_while(|c| *c == '^').count())
|
(false, line[start + tag.len()..].chars().take_while(|c| *c == '^').count())
|
||||||
};
|
};
|
||||||
let kind_start = start + tag.len() + adjusts + (follow as usize);
|
let kind_start = start + tag.len() + adjusts + (follow as usize);
|
||||||
let letters = line[kind_start..].chars();
|
let kind = line[kind_start..].split_whitespace()
|
||||||
let kind = letters.skip_while(|c| c.is_whitespace())
|
.next()
|
||||||
.take_while(|c| !c.is_whitespace())
|
.expect("Encountered unexpected empty comment")
|
||||||
.flat_map(|c| c.to_lowercase())
|
.parse::<ErrorKind>()
|
||||||
.collect::<String>();
|
.ok();
|
||||||
let letters = line[kind_start..].chars();
|
let letters = line[kind_start..].chars();
|
||||||
let msg = letters.skip_while(|c| c.is_whitespace())
|
let msg = letters.skip_while(|c| c.is_whitespace())
|
||||||
.skip_while(|c| !c.is_whitespace())
|
.skip_while(|c| !c.is_whitespace())
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
use common::Config;
|
use common::Config;
|
||||||
use common::{CompileFail, ParseFail, Pretty, RunFail, RunPass, RunPassValgrind};
|
use common::{CompileFail, ParseFail, Pretty, RunFail, RunPass, RunPassValgrind};
|
||||||
use common::{Codegen, DebugInfoLldb, DebugInfoGdb, Rustdoc, CodegenUnits};
|
use common::{Codegen, DebugInfoLldb, DebugInfoGdb, Rustdoc, CodegenUnits};
|
||||||
use errors;
|
use errors::{self, ErrorKind};
|
||||||
use header::TestProps;
|
use header::TestProps;
|
||||||
use header;
|
use header;
|
||||||
use procsrv;
|
use procsrv;
|
||||||
|
@ -1033,8 +1033,8 @@ fn check_expected_errors(revision: Option<&str>,
|
||||||
expected_errors.iter()
|
expected_errors.iter()
|
||||||
.fold((false, false),
|
.fold((false, false),
|
||||||
|(acc_help, acc_note), ee|
|
|(acc_help, acc_note), ee|
|
||||||
(acc_help || ee.kind == "help:" || ee.kind == "help",
|
(acc_help || ee.kind == Some(ErrorKind::Help),
|
||||||
acc_note || ee.kind == "note:" || ee.kind == "note"));
|
acc_note || ee.kind == Some(ErrorKind::Note)));
|
||||||
|
|
||||||
// Scan and extract our error/warning messages,
|
// Scan and extract our error/warning messages,
|
||||||
// which look like:
|
// which look like:
|
||||||
|
@ -1052,15 +1052,15 @@ fn check_expected_errors(revision: Option<&str>,
|
||||||
let mut prev = 0;
|
let mut prev = 0;
|
||||||
for (i, ee) in expected_errors.iter().enumerate() {
|
for (i, ee) in expected_errors.iter().enumerate() {
|
||||||
if !found_flags[i] {
|
if !found_flags[i] {
|
||||||
debug!("prefix={} ee.kind={} ee.msg={} line={}",
|
debug!("prefix={} ee.kind={:?} ee.msg={} line={}",
|
||||||
prefixes[i],
|
prefixes[i],
|
||||||
ee.kind,
|
ee.kind,
|
||||||
ee.msg,
|
ee.msg,
|
||||||
line);
|
line);
|
||||||
// Suggestions have no line number in their output, so take on the line number of
|
// Suggestions have no line number in their output, so take on the line number of
|
||||||
// the previous expected error
|
// the previous expected error
|
||||||
if ee.kind == "suggestion" {
|
if ee.kind == Some(ErrorKind::Suggestion) {
|
||||||
assert!(expected_errors[prev].kind == "help",
|
assert!(expected_errors[prev].kind == Some(ErrorKind::Help),
|
||||||
"SUGGESTIONs must be preceded by a HELP");
|
"SUGGESTIONs must be preceded by a HELP");
|
||||||
if line.contains(&ee.msg) {
|
if line.contains(&ee.msg) {
|
||||||
found_flags[i] = true;
|
found_flags[i] = true;
|
||||||
|
@ -1070,7 +1070,7 @@ fn check_expected_errors(revision: Option<&str>,
|
||||||
}
|
}
|
||||||
if
|
if
|
||||||
(prefix_matches(line, &prefixes[i]) || continuation(line)) &&
|
(prefix_matches(line, &prefixes[i]) || continuation(line)) &&
|
||||||
line.contains(&ee.kind) &&
|
(ee.kind.is_none() || line.contains(&ee.kind.as_ref().unwrap().to_string())) &&
|
||||||
line.contains(&ee.msg)
|
line.contains(&ee.msg)
|
||||||
{
|
{
|
||||||
found_flags[i] = true;
|
found_flags[i] = true;
|
||||||
|
@ -1096,7 +1096,10 @@ fn check_expected_errors(revision: Option<&str>,
|
||||||
if !flag {
|
if !flag {
|
||||||
let ee = &expected_errors[i];
|
let ee = &expected_errors[i];
|
||||||
error(revision, &format!("expected {} on line {} not found: {}",
|
error(revision, &format!("expected {} on line {} not found: {}",
|
||||||
ee.kind, ee.line_num, ee.msg));
|
ee.kind.as_ref()
|
||||||
|
.map_or("message".into(),
|
||||||
|
|k| k.to_string()),
|
||||||
|
ee.line_num, ee.msg));
|
||||||
not_found += 1;
|
not_found += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue