Add let-else to AST
This commit is contained in:
parent
6f388bb369
commit
89d2600d01
10 changed files with 92 additions and 26 deletions
|
@ -1005,13 +1005,42 @@ pub struct Local {
|
|||
pub id: NodeId,
|
||||
pub pat: P<Pat>,
|
||||
pub ty: Option<P<Ty>>,
|
||||
/// Initializer expression to set the value, if any.
|
||||
pub init: Option<P<Expr>>,
|
||||
pub kind: LocalKind,
|
||||
pub span: Span,
|
||||
pub attrs: AttrVec,
|
||||
pub tokens: Option<LazyTokenStream>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub enum LocalKind {
|
||||
/// Local declaration.
|
||||
/// Example: `let x;`
|
||||
Decl,
|
||||
/// Local declaration with an initializer.
|
||||
/// Example: `let x = y;`
|
||||
Init(P<Expr>),
|
||||
/// Local declaration with an initializer and an `else` clause.
|
||||
/// Example: `let Some(x) = y else { return };`
|
||||
InitElse(P<Expr>, P<Block>),
|
||||
}
|
||||
|
||||
impl LocalKind {
|
||||
pub fn init(&self) -> Option<&Expr> {
|
||||
match self {
|
||||
Self::Decl => None,
|
||||
Self::Init(i) | Self::InitElse(i, _) => Some(i),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn init_else_opt(&self) -> Option<(&Expr, Option<&Block>)> {
|
||||
match self {
|
||||
Self::Decl => None,
|
||||
Self::Init(init) => Some((init, None)),
|
||||
Self::InitElse(init, els) => Some((init, Some(els))),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// An arm of a 'match'.
|
||||
///
|
||||
/// E.g., `0..=10 => { println!("match!") }` as in
|
||||
|
|
|
@ -571,11 +571,20 @@ pub fn noop_visit_parenthesized_parameter_data<T: MutVisitor>(
|
|||
}
|
||||
|
||||
pub fn noop_visit_local<T: MutVisitor>(local: &mut P<Local>, vis: &mut T) {
|
||||
let Local { id, pat, ty, init, span, attrs, tokens } = local.deref_mut();
|
||||
let Local { id, pat, ty, kind, span, attrs, tokens } = local.deref_mut();
|
||||
vis.visit_id(id);
|
||||
vis.visit_pat(pat);
|
||||
visit_opt(ty, |ty| vis.visit_ty(ty));
|
||||
visit_opt(init, |init| vis.visit_expr(init));
|
||||
match kind {
|
||||
LocalKind::Decl => {}
|
||||
LocalKind::Init(init) => {
|
||||
vis.visit_expr(init);
|
||||
}
|
||||
LocalKind::InitElse(init, els) => {
|
||||
vis.visit_expr(init);
|
||||
vis.visit_block(els);
|
||||
}
|
||||
}
|
||||
vis.visit_span(span);
|
||||
visit_thin_attrs(attrs, vis);
|
||||
visit_lazy_tts(tokens, vis);
|
||||
|
|
|
@ -242,7 +242,10 @@ pub fn walk_local<'a, V: Visitor<'a>>(visitor: &mut V, local: &'a Local) {
|
|||
}
|
||||
visitor.visit_pat(&local.pat);
|
||||
walk_list!(visitor, visit_ty, &local.ty);
|
||||
walk_list!(visitor, visit_expr, &local.init);
|
||||
if let Some((init, els)) = local.kind.init_else_opt() {
|
||||
visitor.visit_expr(init);
|
||||
walk_list!(visitor, visit_block, els);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn walk_label<'a, V: Visitor<'a>>(visitor: &mut V, label: &'a Label) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue