diff --git a/src/protocol/inputsource.rs b/src/protocol/inputsource.rs index 106b6d76c9ac813bdc99bff0158ca7be8a3c7eec..756f51cc32c3153a8d629f85f7c3ef02942d0521 100644 --- a/src/protocol/inputsource.rs +++ b/src/protocol/inputsource.rs @@ -164,11 +164,6 @@ impl InputPosition { } &source.input[start..end] } - fn eval_error(&self, message: S) -> EvalError { - EvalError { position: *self, message: message.to_string(), backtrace: Backtrace::new() } - } - - pub(crate) fn col(&self) -> usize { self.column } } impl Default for InputPosition { @@ -185,9 +180,6 @@ impl fmt::Display for InputPosition { pub trait SyntaxElement { fn position(&self) -> InputPosition; - fn error(&self, message: S) -> EvalError { - self.position().eval_error(message) - } } #[derive(Debug)] @@ -315,172 +307,3 @@ impl ParseError { self.with_postfixed(ParseErrorType::Info, source, position, msg) } } - -#[derive(Debug, Clone)] -pub struct EvalError { - position: InputPosition, - message: String, - backtrace: Backtrace, -} - -impl EvalError { - pub fn new(position: InputPosition, message: S) -> EvalError { - EvalError { position, message: message.to_string(), backtrace: Backtrace::new() } - } - // Diagnostic methods - pub fn write(&self, source: &InputSource, writer: &mut A) -> io::Result<()> { - if !source.filename.is_empty() { - writeln!( - writer, - "Evaluation error at {}:{}: {}", - source.filename, self.position, self.message - )?; - } else { - writeln!(writer, "Evaluation error at {}: {}", self.position, self.message)?; - } - let line = self.position.context(source); - writeln!(writer, "{}", String::from_utf8_lossy(line))?; - let mut arrow: Vec = Vec::new(); - for pos in 1..self.position.column { - let c = line[pos - 1]; - if c == b'\t' { - arrow.push(b'\t') - } else { - arrow.push(b' ') - } - } - arrow.push(b'^'); - writeln!(writer, "{}", String::from_utf8_lossy(&arrow)) - } - pub fn print(&self, source: &InputSource) { - self.write(source, &mut std::io::stdout()).unwrap() - } - pub fn display<'a>(&'a self, source: &'a InputSource) -> DisplayEvalError<'a> { - DisplayEvalError::new(self, source) - } -} - -impl From for io::Error { - fn from(_: EvalError) -> io::Error { - io::Error::new(io::ErrorKind::InvalidInput, "eval error") - } -} - -#[derive(Clone, Copy)] -pub struct DisplayEvalError<'a> { - error: &'a EvalError, - source: &'a InputSource, -} - -impl DisplayEvalError<'_> { - fn new<'a>(error: &'a EvalError, source: &'a InputSource) -> DisplayEvalError<'a> { - DisplayEvalError { error, source } - } -} - -impl fmt::Display for DisplayEvalError<'_> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut vec: Vec = Vec::new(); - match self.error.write(self.source, &mut vec) { - Err(_) => { - return fmt::Result::Err(fmt::Error); - } - Ok(_) => {} - } - write!(f, "{}", String::from_utf8_lossy(&vec)) - } -} - -// #[cfg(test)] -// mod tests { -// use super::*; - -// #[test] -// fn test_from_string() { -// let mut is = InputSource::from_string("#version 100\n").unwrap(); -// assert!(is.input.len() == 13); -// assert!(is.line == 1); -// assert!(is.column == 1); -// assert!(is.offset == 0); -// let ps = is.pos(); -// assert!(ps.line == 1); -// assert!(ps.column == 1); -// assert!(ps.offset == 0); -// assert!(is.next() == Some(b'#')); -// is.consume(); -// assert!(is.next() == Some(b'v')); -// assert!(is.lookahead(1) == Some(b'e')); -// is.consume(); -// assert!(is.next() == Some(b'e')); -// is.consume(); -// assert!(is.next() == Some(b'r')); -// is.consume(); -// assert!(is.next() == Some(b's')); -// is.consume(); -// assert!(is.next() == Some(b'i')); -// is.consume(); -// { -// let ps = is.pos(); -// assert_eq!(b"#version 100", ps.context(&is)); -// let er = is.error("hello world!"); -// let mut vec: Vec = Vec::new(); -// er.write(&is, &mut vec).unwrap(); -// assert_eq!( -// "Parse error at 1:7: hello world!\n#version 100\n ^\n", -// String::from_utf8_lossy(&vec) -// ); -// } -// assert!(is.next() == Some(b'o')); -// is.consume(); -// assert!(is.next() == Some(b'n')); -// is.consume(); -// assert!(is.input.len() == 13); -// assert!(is.line == 1); -// assert!(is.column == 9); -// assert!(is.offset == 8); -// assert!(is.next() == Some(b' ')); -// is.consume(); -// assert!(is.next() == Some(b'1')); -// is.consume(); -// assert!(is.next() == Some(b'0')); -// is.consume(); -// assert!(is.next() == Some(b'0')); -// is.consume(); -// assert!(is.input.len() == 13); -// assert!(is.line == 1); -// assert!(is.column == 13); -// assert!(is.offset == 12); -// assert!(is.next() == Some(b'\n')); -// is.consume(); -// assert!(is.input.len() == 13); -// assert!(is.line == 2); -// assert!(is.column == 1); -// assert!(is.offset == 13); -// { -// let ps = is.pos(); -// assert_eq!(b"", ps.context(&is)); -// } -// assert!(is.next() == None); -// is.consume(); -// assert!(is.next() == None); -// } - -// #[test] -// fn test_split() { -// let mut is = InputSource::from_string("#version 100\n").unwrap(); -// let backup = is.clone(); -// assert!(is.next() == Some(b'#')); -// is.consume(); -// assert!(is.next() == Some(b'v')); -// is.consume(); -// assert!(is.next() == Some(b'e')); -// is.consume(); -// is = backup; -// assert!(is.next() == Some(b'#')); -// is.consume(); -// assert!(is.next() == Some(b'v')); -// is.consume(); -// assert!(is.next() == Some(b'e')); -// is.consume(); -// } -// }