mirror of https://github.com/rust-lang/rust.git
Auto merge of #62075 - Centril:guardless-match-arms, r=petrochenkov
Remove `ast::Guard` With the introduction of `ast::ExprKind::Let` in https://github.com/rust-lang/rust/pull/60861, the `ast::Guard` structure is now redundant in terms of representing [`if let` guards](https://github.com/rust-lang/rust/issues/51114) in AST since it can be represented by `ExprKind::Let` syntactically. Therefore, we remove `ast::Guard` here. However, we keep `hir::Guard` because the semantic representation is a different matter and this story is more unclear right now (might involve `goto 'arm` in HIR or something...). r? @petrochenkov
This commit is contained in:
commit
3cc3486733
|
@ -1382,7 +1382,7 @@ impl<'a> LoweringContext<'a> {
|
|||
attrs: self.lower_attrs(&arm.attrs),
|
||||
pats: arm.pats.iter().map(|x| self.lower_pat(x)).collect(),
|
||||
guard: match arm.guard {
|
||||
Some(Guard::If(ref x)) => Some(hir::Guard::If(P(self.lower_expr(x)))),
|
||||
Some(ref x) => Some(hir::Guard::If(P(self.lower_expr(x)))),
|
||||
_ => None,
|
||||
},
|
||||
body: P(self.lower_expr(&arm.body)),
|
||||
|
|
|
@ -3055,7 +3055,7 @@ impl<'a> Resolver<'a> {
|
|||
|
||||
self.resolve_pats(&arm.pats, PatternSource::Match);
|
||||
|
||||
if let Some(ast::Guard::If(ref expr)) = arm.guard {
|
||||
if let Some(ref expr) = arm.guard {
|
||||
self.visit_expr(expr)
|
||||
}
|
||||
self.visit_expr(&arm.body);
|
||||
|
|
|
@ -1609,9 +1609,8 @@ impl<'l, 'tcx, 'll, O: DumpOutput + 'll> Visitor<'l> for DumpVisitor<'l, 'tcx, '
|
|||
|
||||
fn visit_arm(&mut self, arm: &'l ast::Arm) {
|
||||
self.process_var_decl_multi(&arm.pats);
|
||||
match arm.guard {
|
||||
Some(ast::Guard::If(ref expr)) => self.visit_expr(expr),
|
||||
_ => {}
|
||||
if let Some(expr) = &arm.guard {
|
||||
self.visit_expr(expr);
|
||||
}
|
||||
self.visit_expr(&arm.body);
|
||||
}
|
||||
|
|
|
@ -893,16 +893,11 @@ pub struct Local {
|
|||
pub struct Arm {
|
||||
pub attrs: Vec<Attribute>,
|
||||
pub pats: Vec<P<Pat>>,
|
||||
pub guard: Option<Guard>,
|
||||
pub guard: Option<P<Expr>>,
|
||||
pub body: P<Expr>,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
|
||||
pub enum Guard {
|
||||
If(P<Expr>),
|
||||
}
|
||||
|
||||
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
|
||||
pub struct Field {
|
||||
pub ident: Ident,
|
||||
|
|
|
@ -131,10 +131,6 @@ pub trait MutVisitor: Sized {
|
|||
noop_visit_arm(a, self);
|
||||
}
|
||||
|
||||
fn visit_guard(&mut self, g: &mut Guard) {
|
||||
noop_visit_guard(g, self);
|
||||
}
|
||||
|
||||
fn visit_pat(&mut self, p: &mut P<Pat>) {
|
||||
noop_visit_pat(p, self);
|
||||
}
|
||||
|
@ -389,17 +385,11 @@ pub fn noop_visit_arm<T: MutVisitor>(
|
|||
) {
|
||||
visit_attrs(attrs, vis);
|
||||
visit_vec(pats, |pat| vis.visit_pat(pat));
|
||||
visit_opt(guard, |guard| vis.visit_guard(guard));
|
||||
visit_opt(guard, |guard| vis.visit_expr(guard));
|
||||
vis.visit_expr(body);
|
||||
vis.visit_span(span);
|
||||
}
|
||||
|
||||
pub fn noop_visit_guard<T: MutVisitor>(g: &mut Guard, vis: &mut T) {
|
||||
match g {
|
||||
Guard::If(e) => vis.visit_expr(e),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn noop_visit_ty_constraint<T: MutVisitor>(
|
||||
AssocTyConstraint { id, ident, kind, span }: &mut AssocTyConstraint,
|
||||
vis: &mut T
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
use crate::ast::{AngleBracketedArgs, ParenthesizedArgs, AttrStyle, BareFnTy};
|
||||
use crate::ast::{GenericBound, TraitBoundModifier};
|
||||
use crate::ast::Unsafety;
|
||||
use crate::ast::{Mod, AnonConst, Arg, Arm, Guard, Attribute, BindingMode, TraitItemKind};
|
||||
use crate::ast::{Mod, AnonConst, Arg, Arm, Attribute, BindingMode, TraitItemKind};
|
||||
use crate::ast::Block;
|
||||
use crate::ast::{BlockCheckMode, CaptureBy, Movability};
|
||||
use crate::ast::{Constness, Crate};
|
||||
|
@ -3396,7 +3396,7 @@ impl<'a> Parser<'a> {
|
|||
let lo = self.token.span;
|
||||
let pats = self.parse_pats()?;
|
||||
let guard = if self.eat_keyword(kw::If) {
|
||||
Some(Guard::If(self.parse_expr()?))
|
||||
Some(self.parse_expr()?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
|
|
@ -2653,14 +2653,10 @@ impl<'a> State<'a> {
|
|||
self.print_outer_attributes(&arm.attrs)?;
|
||||
self.print_pats(&arm.pats)?;
|
||||
self.s.space()?;
|
||||
if let Some(ref g) = arm.guard {
|
||||
match g {
|
||||
ast::Guard::If(ref e) => {
|
||||
self.word_space("if")?;
|
||||
self.print_expr(e)?;
|
||||
self.s.space()?;
|
||||
}
|
||||
}
|
||||
if let Some(ref e) = arm.guard {
|
||||
self.word_space("if")?;
|
||||
self.print_expr(e)?;
|
||||
self.s.space()?;
|
||||
}
|
||||
self.word_space("=>")?;
|
||||
|
||||
|
|
|
@ -826,10 +826,8 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) {
|
|||
|
||||
pub fn walk_arm<'a, V: Visitor<'a>>(visitor: &mut V, arm: &'a Arm) {
|
||||
walk_list!(visitor, visit_pat, &arm.pats);
|
||||
if let Some(ref g) = &arm.guard {
|
||||
match g {
|
||||
Guard::If(ref e) => visitor.visit_expr(e),
|
||||
}
|
||||
if let Some(ref e) = &arm.guard {
|
||||
visitor.visit_expr(e);
|
||||
}
|
||||
visitor.visit_expr(&arm.body);
|
||||
walk_list!(visitor, visit_attribute, &arm.attrs);
|
||||
|
|
Loading…
Reference in New Issue