From 210e46bf24a8cef7f513f0116909d57d76304086 Mon Sep 17 00:00:00 2001 From: Smitty Date: Wed, 16 Jun 2021 16:36:43 -0400 Subject: [PATCH 1/3] Add pattern walking support to THIR walker --- compiler/rustc_mir_build/src/thir/visit.rs | 53 ++++++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_mir_build/src/thir/visit.rs b/compiler/rustc_mir_build/src/thir/visit.rs index 1a60b1de7fd98..0f3276a1b0576 100644 --- a/compiler/rustc_mir_build/src/thir/visit.rs +++ b/compiler/rustc_mir_build/src/thir/visit.rs @@ -20,6 +20,10 @@ pub trait Visitor<'a, 'tcx: 'a>: Sized { walk_arm(self, arm); } + fn visit_pat(&mut self, pat: &Pat<'tcx>) { + walk_pat(self, pat); + } + fn visit_const(&mut self, _cnst: &'tcx Const<'tcx>) {} } @@ -142,18 +146,19 @@ pub fn walk_expr<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, expr: &Exp } pub fn walk_stmt<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, stmt: &Stmt<'tcx>) { - match stmt.kind { - StmtKind::Expr { expr, scope: _ } => visitor.visit_expr(&visitor.thir()[expr]), + match &stmt.kind { + StmtKind::Expr { expr, scope: _ } => visitor.visit_expr(&visitor.thir()[*expr]), StmtKind::Let { initializer, remainder_scope: _, init_scope: _, - pattern: _, + pattern, lint_level: _, } => { if let Some(init) = initializer { - visitor.visit_expr(&visitor.thir()[init]); + visitor.visit_expr(&visitor.thir()[*init]); } + visitor.visit_pat(&pattern); } } } @@ -170,10 +175,48 @@ pub fn walk_block<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, block: &B pub fn walk_arm<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, arm: &Arm<'tcx>) { match arm.guard { Some(Guard::If(expr)) => visitor.visit_expr(&visitor.thir()[expr]), - Some(Guard::IfLet(ref _pat, expr)) => { + Some(Guard::IfLet(ref pat, expr)) => { + visitor.visit_pat(pat); visitor.visit_expr(&visitor.thir()[expr]); } None => {} } + visitor.visit_pat(&arm.pattern); visitor.visit_expr(&visitor.thir()[arm.body]); } + +pub fn walk_pat<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, pat: &Pat<'tcx>) { + use PatKind::*; + match pat.kind.as_ref() { + AscribeUserType { subpattern, .. } + | Deref { subpattern, .. } + | Binding { subpattern: Some(subpattern), .. } => visitor.visit_pat(&subpattern), + Binding { .. } | Wild => {} + Variant { subpatterns, .. } | Leaf { subpatterns } => { + for subpattern in subpatterns { + visitor.visit_pat(&subpattern.pattern); + } + } + Constant { value } => visitor.visit_const(value), + Range(range) => { + visitor.visit_const(range.lo); + visitor.visit_const(range.hi); + } + Slice { prefix, slice, suffix } | Array { prefix, slice, suffix } => { + for subpattern in prefix { + visitor.visit_pat(&subpattern); + } + if let Some(pat) = slice { + visitor.visit_pat(pat); + } + for subpattern in suffix { + visitor.visit_pat(&subpattern); + } + } + Or { pats } => { + for pat in pats { + visitor.visit_pat(&pat); + } + } + }; +} From 1d5accabf1ae1d546f03e8776f0b0c36e14c70a7 Mon Sep 17 00:00:00 2001 From: Smitty Date: Thu, 17 Jun 2021 10:15:02 -0400 Subject: [PATCH 2/3] simplify borrowing --- compiler/rustc_mir_build/src/thir/visit.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_mir_build/src/thir/visit.rs b/compiler/rustc_mir_build/src/thir/visit.rs index 0f3276a1b0576..8f7e3aff11f1f 100644 --- a/compiler/rustc_mir_build/src/thir/visit.rs +++ b/compiler/rustc_mir_build/src/thir/visit.rs @@ -146,19 +146,19 @@ pub fn walk_expr<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, expr: &Exp } pub fn walk_stmt<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, stmt: &Stmt<'tcx>) { - match &stmt.kind { - StmtKind::Expr { expr, scope: _ } => visitor.visit_expr(&visitor.thir()[*expr]), + match stmt.kind { + StmtKind::Expr { expr, scope: _ } => visitor.visit_expr(&visitor.thir()[expr]), StmtKind::Let { initializer, remainder_scope: _, init_scope: _, - pattern, + ref pattern, lint_level: _, } => { if let Some(init) = initializer { - visitor.visit_expr(&visitor.thir()[*init]); + visitor.visit_expr(&visitor.thir()[init]); } - visitor.visit_pat(&pattern); + visitor.visit_pat(pattern); } } } From 281dd6d6e00fd4be40917e2279884b780571506d Mon Sep 17 00:00:00 2001 From: Smitty Date: Thu, 17 Jun 2021 10:17:35 -0400 Subject: [PATCH 3/3] Explicitly write out all fields --- compiler/rustc_mir_build/src/thir/visit.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_mir_build/src/thir/visit.rs b/compiler/rustc_mir_build/src/thir/visit.rs index 8f7e3aff11f1f..12c6a9c00b221 100644 --- a/compiler/rustc_mir_build/src/thir/visit.rs +++ b/compiler/rustc_mir_build/src/thir/visit.rs @@ -188,11 +188,19 @@ pub fn walk_arm<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, arm: &Arm<' pub fn walk_pat<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, pat: &Pat<'tcx>) { use PatKind::*; match pat.kind.as_ref() { - AscribeUserType { subpattern, .. } - | Deref { subpattern, .. } - | Binding { subpattern: Some(subpattern), .. } => visitor.visit_pat(&subpattern), + AscribeUserType { subpattern, ascription: _ } + | Deref { subpattern } + | Binding { + subpattern: Some(subpattern), + mutability: _, + mode: _, + var: _, + ty: _, + is_primary: _, + name: _, + } => visitor.visit_pat(&subpattern), Binding { .. } | Wild => {} - Variant { subpatterns, .. } | Leaf { subpatterns } => { + Variant { subpatterns, adt_def: _, substs: _, variant_index: _ } | Leaf { subpatterns } => { for subpattern in subpatterns { visitor.visit_pat(&subpattern.pattern); }