diff options
Diffstat (limited to 'src/compiletest/errors.rs')
| -rw-r--r-- | src/compiletest/errors.rs | 76 |
1 files changed, 22 insertions, 54 deletions
diff --git a/src/compiletest/errors.rs b/src/compiletest/errors.rs index 4e65115caa2..408206b16e9 100644 --- a/src/compiletest/errors.rs +++ b/src/compiletest/errors.rs @@ -1,4 +1,4 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -9,6 +9,7 @@ // except according to those terms. use std::io::{BufferedReader, File}; +use regex::Regex; pub struct ExpectedError { pub line: uint, @@ -16,61 +17,28 @@ pub struct ExpectedError { pub msg: StrBuf, } -// Load any test directives embedded in the file -pub fn load_errors(testfile: &Path) -> Vec<ExpectedError> { +pub static EXPECTED_PATTERN : &'static str = r"//~(?P<adjusts>\^*)\s*(?P<kind>\S*)\s*(?P<msg>.*)"; - let mut error_patterns = Vec::new(); +// Load any test directives embedded in the file +pub fn load_errors(re: &Regex, testfile: &Path) -> Vec<ExpectedError> { let mut rdr = BufferedReader::new(File::open(testfile).unwrap()); - let mut line_num = 1u; - for ln in rdr.lines() { - error_patterns.push_all_move(parse_expected(line_num, - ln.unwrap().to_strbuf())); - line_num += 1u; - } - return error_patterns; -} - -fn parse_expected(line_num: uint, line: StrBuf) -> Vec<ExpectedError> { - let line = line.as_slice().trim().to_strbuf(); - let error_tag = "//~".to_strbuf(); - let mut idx; - match line.as_slice().find_str(error_tag.as_slice()) { - None => return Vec::new(), - Some(nn) => { idx = (nn as uint) + error_tag.len(); } - } - - // "//~^^^ kind msg" denotes a message expected - // three lines above current line: - let mut adjust_line = 0u; - let len = line.len(); - while idx < len && line.as_slice()[idx] == ('^' as u8) { - adjust_line += 1u; - idx += 1u; - } - // Extract kind: - while idx < len && line.as_slice()[idx] == (' ' as u8) { - idx += 1u; - } - let start_kind = idx; - while idx < len && line.as_slice()[idx] != (' ' as u8) { - idx += 1u; - } - - let kind = line.as_slice().slice(start_kind, idx); - let kind = kind.to_ascii().to_lower().into_str().to_strbuf(); - - // Extract msg: - while idx < len && line.as_slice()[idx] == (' ' as u8) { - idx += 1u; - } - let msg = line.as_slice().slice(idx, len).to_strbuf(); - - debug!("line={} kind={} msg={}", line_num - adjust_line, kind, msg); + rdr.lines().enumerate().filter_map(|(line_no, ln)| { + parse_expected(line_no + 1, ln.unwrap(), re) + }).collect() +} - return vec!(ExpectedError{ - line: line_num - adjust_line, - kind: kind, - msg: msg, - }); +fn parse_expected(line_num: uint, line: &str, re: &Regex) -> Option<ExpectedError> { + re.captures(line).and_then(|caps| { + let adjusts = caps.name("adjusts").len(); + let kind = caps.name("kind").to_ascii().to_lower().into_str().to_strbuf(); + let msg = caps.name("msg").trim().to_strbuf(); + + debug!("line={} kind={} msg={}", line_num, kind, msg); + Some(ExpectedError { + line: line_num - adjusts, + kind: kind, + msg: msg, + }) + }) } |
