Nicer error messages for unknown tokens (#974)

This commit is contained in:
Adam Chalmers
2023-11-01 18:08:22 -05:00
committed by GitHub
parent 2d2a85ae7d
commit 0b9ba55bb4
3 changed files with 13 additions and 16 deletions

View File

@ -36,13 +36,13 @@ impl Parser {
if !self.unknown_tokens.is_empty() { if !self.unknown_tokens.is_empty() {
let source_ranges = self.unknown_tokens.iter().map(SourceRange::from).collect(); let source_ranges = self.unknown_tokens.iter().map(SourceRange::from).collect();
return Err(KclError::Lexical(KclErrorDetails { let token_list = self.unknown_tokens.iter().map(|t| t.value.as_str()).collect::<Vec<_>>();
source_ranges, let message = if token_list.len() == 1 {
message: format!( format!("found unknown token '{}'", token_list[0])
"found unknown tokens {:?}", } else {
self.unknown_tokens.iter().map(|t| t.value.as_str()).collect::<Vec<_>>() format!("found unknown tokens [{}]", token_list.join(", "))
), };
})); return Err(KclError::Lexical(KclErrorDetails { source_ranges, message }));
} }
parser_impl::run_parser(&mut self.tokens.as_slice()) parser_impl::run_parser(&mut self.tokens.as_slice())

View File

@ -2214,9 +2214,10 @@ const secondExtrude = startSketchOn('XY')
let tokens = crate::token::lexer(">!"); let tokens = crate::token::lexer(">!");
let parser = crate::parser::Parser::new(tokens); let parser = crate::parser::Parser::new(tokens);
let err = parser.ast().unwrap_err(); let err = parser.ast().unwrap_err();
// TODO: Better errors when program cannot tokenize. assert_eq!(
// https://github.com/KittyCAD/modeling-app/issues/696 err.to_string(),
assert!(err.to_string().contains("found list of unknown tokens")); r#"lexical: KclErrorDetails { source_ranges: [SourceRange([1, 2])], message: "found unknown token '!'" }"#
);
} }
#[test] #[test]
@ -2272,11 +2273,9 @@ z(-[["#,
let parser = crate::parser::Parser::new(tokens); let parser = crate::parser::Parser::new(tokens);
let result = parser.ast(); let result = parser.ast();
assert!(result.is_err()); assert!(result.is_err());
// TODO: Better errors when program cannot tokenize.
// https://github.com/KittyCAD/modeling-app/issues/696
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
r##"lexical: KclErrorDetails { source_ranges: [SourceRange([6, 7])], message: "found list of unknown tokens \"#\"" }"## r#"lexical: KclErrorDetails { source_ranges: [SourceRange([6, 7])], message: "found unknown token '#'" }"#
); );
} }
@ -2286,11 +2285,9 @@ z(-[["#,
let parser = crate::parser::Parser::new(tokens); let parser = crate::parser::Parser::new(tokens);
let result = parser.ast(); let result = parser.ast();
assert!(result.is_err()); assert!(result.is_err());
// TODO: Better errors when program cannot tokenize.
// https://github.com/KittyCAD/modeling-app/issues/696
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
r##"lexical: KclErrorDetails { source_ranges: [SourceRange([25, 26]), SourceRange([26, 27])], message: "found list of unknown tokens \"# #\"" }"## r#"lexical: KclErrorDetails { source_ranges: [SourceRange([25, 26]), SourceRange([26, 27])], message: "found unknown tokens [#, #]" }"#
); );
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB