diff --git a/src/build/compile_test.rs b/src/build/compile_test.rs index d761303..8610282 100644 --- a/src/build/compile_test.rs +++ b/src/build/compile_test.rs @@ -159,8 +159,7 @@ fn test_assert_just_keyword_compile_failures() { assert_build_failure( "assert ", vec![ - Regex::new(r"line: 1, column: 1").unwrap(), - Regex::new(r"Expected Tuple \{ok=, desc=\}: at line: 1, column: 8") + Regex::new(r"Expected Tuple \{ok=, desc=\} at line: 1, column: 8") .unwrap(), ], ); @@ -171,10 +170,9 @@ fn test_assert_partial_tuple_compile_failures() { assert_build_failure( "assert {", vec![ - Regex::new(r"line: 1, column: 1").unwrap(), - Regex::new(r"Expected Tuple \{ok=, desc=\}: at line: 1, column: 8") + Regex::new(r"Expected Tuple \{ok=, desc=\} at line: 1, column: 8") .unwrap(), - Regex::new(r"Expected \(\}\) but got \(\): at line: 1, column: 9").unwrap(), + Regex::new(r"Expected \(\}\) but got \(\) at line: 1, column: 9").unwrap(), ], ); } @@ -227,10 +225,7 @@ fn test_assert_partial_tuple_bad_desc_compile_failures() { fn test_import_missing_path_compile_failure() { assert_build_failure( "import ;", - vec![ - Regex::new(r"Expected import path: at line: 1, column: 8").unwrap(), - Regex::new(r"Not a String: at line: 1, column: 8").unwrap(), - ], + vec![Regex::new(r"Expected import path at line: 1, column: 8").unwrap()], ) } @@ -238,10 +233,7 @@ fn test_import_missing_path_compile_failure() { fn test_import_path_not_a_string_compile_failure() { assert_build_failure( "import 1;", - vec![ - Regex::new(r"Expected import path: at line: 1, column: 8").unwrap(), - Regex::new(r"Not a String: at line: 1, column: 8").unwrap(), - ], + vec![Regex::new(r"Expected import path at line: 1, column: 8").unwrap()], ) } @@ -250,7 +242,7 @@ fn test_binary_operator_missing_operand_compile_failure() { assert_build_failure( "1 +", vec![ - Regex::new(r"Missing operand for binary expression: at line: 1, column: 4") + Regex::new(r"Missing operand for binary expression at line: 1, column: 4") .unwrap(), ], ) @@ -427,7 +419,6 @@ fn test_out_missing_type_compile_failure() { "out", vec![ Regex::new(r"Expected converter name").unwrap(), - Regex::new(r"Not a Bareword").unwrap(), Regex::new(r"at line: 1, column: 4").unwrap(), ], ) diff --git a/src/build/mod.rs b/src/build/mod.rs index f3ab947..b16977f 100644 --- a/src/build/mod.rs +++ b/src/build/mod.rs @@ -328,16 +328,7 @@ where Some(val) => Ok(val), } } - Err(err) => { - let cause = Box::new(simple_error::SimpleError::new(err)); - Err(error::BuildError::with_pos( - "Unable to parse input", - error::ErrorType::ParseError, - (&input).into(), - ) - .wrap_cause(cause) - .to_boxed()) - } + Err(err) => Err(Box::new(err)), } } diff --git a/src/error.rs b/src/error.rs index 3240bfa..45c2655 100644 --- a/src/error.rs +++ b/src/error.rs @@ -145,48 +145,28 @@ impl error::Error for BuildError { } } -#[derive(Debug)] -pub struct StackPrinter { - pub err: abortable_parser::Error, +impl<'a, C> std::convert::From> for BuildError +where + C: FilePositioned + 'a, + C: abortable_parser::Offsetable + Debug, +{ + fn from(e: abortable_parser::Error) -> BuildError { + BuildError::from(&e) + } } -impl StackPrinter { - pub fn render(&self, w: &mut fmt::Formatter) -> fmt::Result { - let mut curr_err = Some(&self.err); - let mut tabstop = ""; - loop { - match curr_err { - // our exit condition; - None => break, - Some(err) => { - let context = err.get_context(); - let file = match context.file() { - Some(ref pb) => pb.to_string_lossy().to_string(), - None => "".to_string(), - }; - writeln!( - w, - "{}{}: at {} line: {}, column: {}", - tabstop, - err.get_msg(), - file, - context.line(), - context.column(), - )?; - tabstop = "\t"; - curr_err = err.get_cause(); - if curr_err.is_some() { - writeln!(w, "Caused by:")?; - } - } - } +impl<'a, C> std::convert::From<&'a abortable_parser::Error> for BuildError +where + C: FilePositioned + 'a, + C: abortable_parser::Offsetable + Debug, +{ + fn from(e: &'a abortable_parser::Error) -> BuildError { + let ctx = e.get_context(); + let position = Position::new(ctx.line(), ctx.column(), ctx.get_offset()); + let err = BuildError::with_pos(e.get_msg(), ErrorType::ParseError, position); + match e.get_cause() { + None => err, + Some(cause) => err.wrap_cause(Box::new(BuildError::from(cause))), } - Ok(()) - } -} - -impl fmt::Display for StackPrinter { - fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result { - self.render(w) } } diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 8a7e649..eb825d0 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -24,7 +24,7 @@ use abortable_parser::{Error, Peekable, Result}; use self::precedence::op_expression; use crate::ast::*; -use crate::error::StackPrinter; +use crate::error::BuildError; use crate::iter::OffsetStrIter; use crate::tokenizer::*; @@ -857,7 +857,7 @@ fn statement(i: SliceIter) -> Result, Statement> { pub fn parse<'a>( input: OffsetStrIter<'a>, comment_map: Option<&mut CommentMap>, -) -> std::result::Result, String> { +) -> std::result::Result, BuildError> { match tokenize(input.clone(), comment_map) { Ok(tokenized) => { let mut out = Vec::new(); @@ -871,20 +871,17 @@ pub fn parse<'a>( } match statement(i.clone()) { Result::Abort(e) => { - let ctx_err = StackPrinter { err: e }; - return Err(format!("{}", ctx_err)); + return Err(BuildError::from(e)); } Result::Fail(e) => { - let ctx_err = StackPrinter { err: e }; - return Err(format!("{}", ctx_err)); + return Err(BuildError::from(e)); } Result::Incomplete(_ei) => { let err = abortable_parser::Error::new( "Unexpected end of parse input", Box::new(i.clone()), ); - let ctx_err = StackPrinter { err: err }; - return Err(format!("{}", ctx_err)); + return Err(BuildError::from(err)); } Result::Complete(rest, stmt) => { out.push(stmt); diff --git a/src/parse/precedence.rs b/src/parse/precedence.rs index f84474e..ab13234 100644 --- a/src/parse/precedence.rs +++ b/src/parse/precedence.rs @@ -260,11 +260,7 @@ fn parse_operand_list<'a>(i: SliceIter<'a, Token>) -> ParseResult<'a, Vec; @@ -466,7 +466,7 @@ fn token<'a>(input: OffsetStrIter<'a>) -> Result, Token> { pub fn tokenize<'a>( input: OffsetStrIter<'a>, mut comment_map: Option<&mut CommentMap>, -) -> std::result::Result, String> { +) -> std::result::Result, BuildError> { let mut out = Vec::new(); let mut i = input.clone(); let mut comment_group = Vec::new(); @@ -477,28 +477,15 @@ pub fn tokenize<'a>( } match token(i.clone()) { Result::Abort(e) => { - let err = abortable_parser::Error::caused_by( - "Invalid Token encountered", - Box::new(e), - Box::new(i.clone()), - ); - let ctx_err = StackPrinter { err: err }; - return Err(format!("{}", ctx_err)); + return Err(BuildError::from(e)); } Result::Fail(e) => { - let err = abortable_parser::Error::caused_by( - "Invalid Token encountered", - Box::new(e), - Box::new(i.clone()), - ); - let ctx_err = StackPrinter { err: err }; - return Err(format!("{}", ctx_err)); + return Err(BuildError::from(e)); } Result::Incomplete(_offset) => { let err = abortable_parser::Error::new("Invalid Token encountered", Box::new(i.clone())); - let ctx_err = StackPrinter { err: err }; - return Err(format!("{}", ctx_err)); + return Err(BuildError::from(err)); } Result::Complete(rest, tok) => { i = rest;