resolve: merge resolve_pats and resolve_pattern_top.

This commit is contained in:
Mazdak Farrokhzad 2019-09-01 23:52:32 +02:00
parent d8ef907886
commit a867c5f9cc

View file

@ -1112,7 +1112,6 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
let mut bindings = smallvec![(false, <_>::default())]; let mut bindings = smallvec![(false, <_>::default())];
for Param { pat, ty, .. } in params { for Param { pat, ty, .. } in params {
self.resolve_pattern(pat, PatternSource::FnParam, &mut bindings); self.resolve_pattern(pat, PatternSource::FnParam, &mut bindings);
self.check_consistent_bindings_top(pat);
self.visit_ty(ty); self.visit_ty(ty);
debug!("(resolving function / closure) recorded parameter"); debug!("(resolving function / closure) recorded parameter");
} }
@ -1248,29 +1247,15 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
fn resolve_arm(&mut self, arm: &Arm) { fn resolve_arm(&mut self, arm: &Arm) {
self.with_rib(ValueNS, NormalRibKind, |this| { self.with_rib(ValueNS, NormalRibKind, |this| {
this.resolve_pats(&arm.pats, PatternSource::Match); this.resolve_pattern_top(&arm.pat, PatternSource::Match);
walk_list!(this, visit_expr, &arm.guard); walk_list!(this, visit_expr, &arm.guard);
this.visit_expr(&arm.body); this.visit_expr(&arm.body);
}); });
} }
/// Arising from `source`, resolve a sequence of patterns (top level or-patterns). /// Arising from `source`, resolve a top level pattern.
fn resolve_pats(&mut self, pats: &[P<Pat>], source: PatternSource) {
let mut bindings = smallvec![(true, <_>::default())];
for pat in pats {
bindings.push((false, <_>::default()));
self.resolve_pattern(pat, source, &mut bindings);
let collected = bindings.pop().unwrap().1;
bindings.last_mut().unwrap().1.extend(collected);
}
// This has to happen *after* we determine which pat_idents are variants
self.check_consistent_bindings(pats);
}
fn resolve_pattern_top(&mut self, pat: &Pat, pat_src: PatternSource) { fn resolve_pattern_top(&mut self, pat: &Pat, pat_src: PatternSource) {
self.resolve_pattern(pat, pat_src, &mut smallvec![(false, <_>::default())]); self.resolve_pattern(pat, pat_src, &mut smallvec![(false, <_>::default())]);
// This has to happen *after* we determine which pat_idents are variants:
self.check_consistent_bindings_top(pat);
} }
fn resolve_pattern( fn resolve_pattern(
@ -1280,6 +1265,8 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
bindings: &mut SmallVec<[(bool, FxHashSet<Ident>); 1]>, bindings: &mut SmallVec<[(bool, FxHashSet<Ident>); 1]>,
) { ) {
self.resolve_pattern_inner(pat, pat_src, bindings); self.resolve_pattern_inner(pat, pat_src, bindings);
// This has to happen *after* we determine which pat_idents are variants:
self.check_consistent_bindings_top(pat);
visit::walk_pat(self, pat); visit::walk_pat(self, pat);
} }
@ -1866,9 +1853,9 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
visit::walk_expr(self, expr); visit::walk_expr(self, expr);
} }
ExprKind::Let(ref pats, ref scrutinee) => { ExprKind::Let(ref pat, ref scrutinee) => {
self.visit_expr(scrutinee); self.visit_expr(scrutinee);
self.resolve_pats(pats, PatternSource::Let); self.resolve_pattern_top(pat, PatternSource::Let);
} }
ExprKind::If(ref cond, ref then, ref opt_else) => { ExprKind::If(ref cond, ref then, ref opt_else) => {