Fail more gently for bad list/table parses

This commit is contained in:
JT 2021-09-07 15:56:30 +12:00
parent b8e8061787
commit e00da070fd
2 changed files with 35 additions and 22 deletions

View File

@ -161,15 +161,14 @@ pub fn lex_item(
let span = Span::new(span_offset + token_start, span_offset + *curr_offset); let span = Span::new(span_offset + token_start, span_offset + *curr_offset);
// If there is still unclosed opening delimiters, close them and add // If there is still unclosed opening delimiters, remember they were missing
// synthetic closing characters to the accumulated token.
if let Some(block) = block_level.last() { if let Some(block) = block_level.last() {
let delim = block.closing(); let delim = block.closing();
let cause = ParseError::UnexpectedEof( let cause = ParseError::UnexpectedEof(
(delim as char).to_string(), (delim as char).to_string(),
Span { Span {
start: span.end - 1, start: span.end,
end: span.end, end: span.end + 1,
}, },
); );

View File

@ -2050,6 +2050,19 @@ pub fn parse_value(
} }
} }
SyntaxShape::Any => { SyntaxShape::Any => {
if bytes.starts_with(b"[") {
let shapes = [SyntaxShape::Table];
for shape in shapes.iter() {
if let (s, None) = parse_value(working_set, span, shape) {
return (s, None);
}
}
parse_value(
working_set,
span,
&SyntaxShape::List(Box::new(SyntaxShape::Any)),
)
} else {
let shapes = [ let shapes = [
SyntaxShape::Int, SyntaxShape::Int,
SyntaxShape::Number, SyntaxShape::Number,
@ -2071,6 +2084,7 @@ pub fn parse_value(
Some(ParseError::Expected("any shape".into(), span)), Some(ParseError::Expected("any shape".into(), span)),
) )
} }
}
_ => (garbage(span), Some(ParseError::IncompleteParser(span))), _ => (garbage(span), Some(ParseError::IncompleteParser(span))),
} }
} }