Add ErrorGuaranteed
to Recovered::Yes
and use it more.
The starting point for this was identical comments on two different fields, in `ast::VariantData::Struct` and `hir::VariantData::Struct`: ``` // FIXME: investigate making this a `Option<ErrorGuaranteed>` recovered: bool ``` I tried that, and then found that I needed to add an `ErrorGuaranteed` to `Recovered::Yes`. Then I ended up using `Recovered` instead of `Option<ErrorGuaranteed>` for these two places and elsewhere, which required moving `ErrorGuaranteed` from `rustc_parse` to `rustc_ast`. This makes things more consistent, because `Recovered` is used in more places, and there are fewer uses of `bool` and `Option<ErrorGuaranteed>`. And safer, because it's difficult/impossible to set `recovered` to `Recovered::Yes` without having emitted an error.
This commit is contained in:
parent
87293c9585
commit
fd91925bce
16 changed files with 91 additions and 105 deletions
|
@ -1308,9 +1308,9 @@ pub struct LetExpr<'hir> {
|
|||
pub pat: &'hir Pat<'hir>,
|
||||
pub ty: Option<&'hir Ty<'hir>>,
|
||||
pub init: &'hir Expr<'hir>,
|
||||
/// `Some` when this let expressions is not in a syntanctically valid location.
|
||||
/// `Recovered::Yes` when this let expressions is not in a syntanctically valid location.
|
||||
/// Used to prevent building MIR in such situations.
|
||||
pub is_recovered: Option<ErrorGuaranteed>,
|
||||
pub recovered: ast::Recovered,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, HashStable_Generic)]
|
||||
|
@ -3030,11 +3030,7 @@ pub enum VariantData<'hir> {
|
|||
/// A struct variant.
|
||||
///
|
||||
/// E.g., `Bar { .. }` as in `enum Foo { Bar { .. } }`.
|
||||
Struct {
|
||||
fields: &'hir [FieldDef<'hir>],
|
||||
// FIXME: investigate making this a `Option<ErrorGuaranteed>`
|
||||
recovered: bool,
|
||||
},
|
||||
Struct { fields: &'hir [FieldDef<'hir>], recovered: ast::Recovered },
|
||||
/// A tuple variant.
|
||||
///
|
||||
/// E.g., `Bar(..)` as in `enum Foo { Bar(..) }`.
|
||||
|
|
|
@ -768,7 +768,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr<'v>)
|
|||
ExprKind::DropTemps(ref subexpression) => {
|
||||
try_visit!(visitor.visit_expr(subexpression));
|
||||
}
|
||||
ExprKind::Let(LetExpr { span: _, pat, ty, init, is_recovered: _ }) => {
|
||||
ExprKind::Let(LetExpr { span: _, pat, ty, init, recovered: _ }) => {
|
||||
// match the visit order in walk_local
|
||||
try_visit!(visitor.visit_expr(init));
|
||||
try_visit!(visitor.visit_pat(pat));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue