Do not emit type errors on recovered blocks
When a parse error occurs on a block, the parser will recover and create a block with the statements collected until that point. Now a flag stating that a recovery has been performed in this block is propagated so that the type checker knows that the type of the block (which will be identified as `()`) shouldn't be checked against the expectation to reduce the amount of irrelevant diagnostic errors shown to the user.
This commit is contained in:
parent
b7b52cc8bf
commit
aaf3e318fc
25 changed files with 112 additions and 41 deletions
|
@ -4371,13 +4371,15 @@ impl<'a> Parser<'a> {
|
|||
/// Precondition: already parsed the '{'.
|
||||
fn parse_block_tail(&mut self, lo: Span, s: BlockCheckMode) -> PResult<'a, P<Block>> {
|
||||
let mut stmts = vec![];
|
||||
let mut recovered = false;
|
||||
|
||||
while !self.eat(&token::CloseDelim(token::Brace)) {
|
||||
let stmt = match self.parse_full_stmt(false) {
|
||||
Err(mut err) => {
|
||||
err.emit();
|
||||
self.recover_stmt_(SemiColonMode::Ignore, BlockMode::Break);
|
||||
self.recover_stmt_(SemiColonMode::Ignore, BlockMode::Ignore);
|
||||
self.eat(&token::CloseDelim(token::Brace));
|
||||
recovered = true;
|
||||
break;
|
||||
}
|
||||
Ok(stmt) => stmt,
|
||||
|
@ -4396,12 +4398,13 @@ impl<'a> Parser<'a> {
|
|||
id: ast::DUMMY_NODE_ID,
|
||||
rules: s,
|
||||
span: lo.to(self.prev_span),
|
||||
recovered,
|
||||
}))
|
||||
}
|
||||
|
||||
/// Parse a statement, including the trailing semicolon.
|
||||
pub fn parse_full_stmt(&mut self, macro_legacy_warnings: bool) -> PResult<'a, Option<Stmt>> {
|
||||
let mut stmt = match self.parse_stmt_(macro_legacy_warnings) {
|
||||
let mut stmt = match self.parse_stmt_without_recovery(macro_legacy_warnings)? {
|
||||
Some(stmt) => stmt,
|
||||
None => return Ok(None),
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue