1
Fork 0

Streamline lex_token_trees error handling.

- Use iterators instead of `for` loops.
- Use `if`/`else` instead of `match`.
This commit is contained in:
Nicholas Nethercote 2024-11-15 14:54:15 +11:00
parent 4cd2840f00
commit 16a39bb7ca

View file

@ -72,29 +72,23 @@ pub(crate) fn lex_token_trees<'psess, 'src>(
let (_open_spacing, stream, res) = lexer.lex_token_trees(/* is_delimited */ false); let (_open_spacing, stream, res) = lexer.lex_token_trees(/* is_delimited */ false);
let unmatched_delims = lexer.diag_info.unmatched_delims; let unmatched_delims = lexer.diag_info.unmatched_delims;
match res { if res.is_ok() && unmatched_delims.is_empty() {
Ok(()) if unmatched_delims.is_empty() => Ok(stream), Ok(stream)
_ => { } else {
// Return error if there are unmatched delimiters or unclosed delimiters. // Return error if there are unmatched delimiters or unclosed delimiters.
// We emit delimiter mismatch errors first, then emit the unclosing delimiter mismatch // We emit delimiter mismatch errors first, then emit the unclosing delimiter mismatch
// because the delimiter mismatch is more likely to be the root cause of error // because the delimiter mismatch is more likely to be the root cause of error
let mut buffer: Vec<_> = unmatched_delims
let mut buffer = Vec::with_capacity(1); .into_iter()
for unmatched in unmatched_delims { .filter_map(|unmatched_delim| make_unclosed_delims_error(unmatched_delim, psess))
if let Some(err) = make_unclosed_delims_error(unmatched, psess) { .collect();
buffer.push(err);
}
}
if let Err(errs) = res { if let Err(errs) = res {
// Add unclosing delimiter or diff marker errors // Add unclosing delimiter or diff marker errors
for err in errs { buffer.extend(errs);
buffer.push(err);
}
} }
Err(buffer) Err(buffer)
} }
} }
}
struct Lexer<'psess, 'src> { struct Lexer<'psess, 'src> {
psess: &'psess ParseSess, psess: &'psess ParseSess,