diff --git a/lalrpop-test/src/error_recovery.lalrpop b/lalrpop-test/src/error_recovery.lalrpop index f88c267..5296926 100644 --- a/lalrpop-test/src/error_recovery.lalrpop +++ b/lalrpop-test/src/error_recovery.lalrpop @@ -3,7 +3,7 @@ use std::cell::RefCell; use util::tok::Tok; use lalrpop_util::ErrorRecovery; -grammar<'e>(errors: &'e RefCell>>); +grammar<'e>(errors: &'e RefCell>>); extern { enum Tok { diff --git a/lalrpop-test/src/error_recovery_pull_182.lalrpop b/lalrpop-test/src/error_recovery_pull_182.lalrpop index eddcf81..ea78176 100644 --- a/lalrpop-test/src/error_recovery_pull_182.lalrpop +++ b/lalrpop-test/src/error_recovery_pull_182.lalrpop @@ -2,7 +2,7 @@ use util::tok::Tok; use lalrpop_util::ErrorRecovery; -grammar<'input, 'e>(errors: &'e mut Vec>); +grammar<'input, 'e>(errors: &'e mut Vec>); extern { enum Tok { diff --git a/lalrpop-test/src/main.rs b/lalrpop-test/src/main.rs index 1fb4010..4567b2c 100644 --- a/lalrpop-test/src/main.rs +++ b/lalrpop-test/src/main.rs @@ -155,24 +155,30 @@ fn expr_intern_tok_test_err() { } #[test] -fn expr_intern_tok_display_err() { +fn parse_error_map() { let expr = "(1+\n(2++3))"; let result = expr_intern_tok::parse_Expr(1, expr); - let err : lalrpop_util::ParseError + let err : lalrpop_util::ParseError = result.unwrap_err(); - // The problem is that (usize,&str) and () do not implement fmt::Display, - // so neither does the ParseError. - // We can fix that by rewriting them to something that has fmt::Display - let disp = err.map_token(|(_,t)|t).map_error(|_| "error"); - let message = disp.to_string(); - assert!(message.contains("Unrecognized token `+`")); + let message = err + .map_token(|(_,t)| format!("TOKEN {}", t)) + .map_location(|offset| format!("line {}", expr[0..offset].lines().count())) + .to_string(); + assert!(message.contains("Unrecognized token `TOKEN +`")); + assert!(message.contains("at line 2")); +} - // We can even convert the locations to a line number - let line_based = disp.map_location(|offset| { - format!("line {}", expr[0..offset].lines().count()) - }); - assert!(line_based.to_string().contains("line 2")); +#[test] +fn parse_error_map_err() { + let err : lalrpop_util::ParseError + = util::test_err_gen(error::parse_Items, "---+").unwrap_err(); + let modified_err = err.map_error(|c| c.to_string()); + if let ParseError::User { error: user_error_value } = modified_err { + assert_eq!(user_error_value, "+"); + } else { + panic!("Expected a User error") + } } #[test] diff --git a/lalrpop-test/src/util/mod.rs b/lalrpop-test/src/util/mod.rs index 1e2994e..f33a313 100644 --- a/lalrpop-test/src/util/mod.rs +++ b/lalrpop-test/src/util/mod.rs @@ -9,7 +9,7 @@ use util::tok::Tok; pub mod tok; pub fn test(parse_fn: F, input: &str, expected: R) - where F: FnOnce(Vec) -> Result> + where F: FnOnce(Vec) -> Result> { // create tokens let tokens = tok::tokenize(input); @@ -29,7 +29,7 @@ pub fn test(parse_fn: F, input: &str, expected: R) } pub fn test_loc(parse_fn: F, input: &str, expected: R) - where F: FnOnce(Vec<(usize, Tok, usize)>) -> Result> + where F: FnOnce(Vec<(usize, Tok, usize)>) -> Result> { // create tokens let tokens = tok::tokenize(input); diff --git a/lalrpop/src/grammar/repr.rs b/lalrpop/src/grammar/repr.rs index 8a2e201..ca4cb44 100644 --- a/lalrpop/src/grammar/repr.rs +++ b/lalrpop/src/grammar/repr.rs @@ -263,6 +263,7 @@ impl Types { terminal_token_type: terminal_token_type, terminal_types: map(), nonterminal_types: map(), + // the following two will be overwritten later parse_error_type: TypeRepr::Tuple(vec![]), error_recovery_type: TypeRepr::Tuple(vec![]) }; @@ -314,7 +315,11 @@ impl Types { pub fn error_type(&self) -> TypeRepr { self.error_type.clone() - .unwrap_or_else(|| TypeRepr::Tuple(vec![])) + .unwrap_or_else(|| TypeRepr::Ref { + lifetime: Some(intern("'static")), + mutable: false, + referent: Box::new(TypeRepr::str()), + }) } pub fn terminal_type(&self, id: TerminalString) -> &TypeRepr { diff --git a/lalrpop/src/normalize/tyinfer/test.rs b/lalrpop/src/normalize/tyinfer/test.rs index 5b05cda..3774458 100644 --- a/lalrpop/src/normalize/tyinfer/test.rs +++ b/lalrpop/src/normalize/tyinfer/test.rs @@ -220,6 +220,6 @@ fn error() { grammar; Z = !; "#, vec![ - ("Z", "__lalrpop_util::ParseError") + ("Z", "__lalrpop_util::ParseError") ]) }