Skip to content

Commit 70a65e9

Browse files
committed
let_chains: Handle in resolve.
1 parent dff1e37 commit 70a65e9

File tree

1 file changed

+24
-38
lines changed

1 file changed

+24
-38
lines changed

src/librustc_resolve/lib.rs

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -485,8 +485,8 @@ type BindingMap = FxHashMap<Ident, BindingInfo>;
485485
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
486486
enum PatternSource {
487487
Match,
488-
IfLet,
489-
WhileLet,
488+
// FIXME(54883): Consider fusing with `Let` below once let-statements support or-patterns.
489+
LetExpr,
490490
Let,
491491
For,
492492
FnParam,
@@ -496,9 +496,7 @@ impl PatternSource {
496496
fn descr(self) -> &'static str {
497497
match self {
498498
PatternSource::Match => "match binding",
499-
PatternSource::IfLet => "if let binding",
500-
PatternSource::WhileLet => "while let binding",
501-
PatternSource::Let => "let binding",
499+
PatternSource::Let | PatternSource::LetExpr => "let binding",
502500
PatternSource::For => "for binding",
503501
PatternSource::FnParam => "function parameter",
504502
}
@@ -3057,13 +3055,7 @@ impl<'a> Resolver<'a> {
30573055
fn resolve_arm(&mut self, arm: &Arm) {
30583056
self.ribs[ValueNS].push(Rib::new(NormalRibKind));
30593057

3060-
let mut bindings_list = FxHashMap::default();
3061-
for pattern in &arm.pats {
3062-
self.resolve_pattern(&pattern, PatternSource::Match, &mut bindings_list);
3063-
}
3064-
3065-
// This has to happen *after* we determine which pat_idents are variants.
3066-
self.check_consistent_bindings(&arm.pats);
3058+
self.resolve_pats(&arm.pats, PatternSource::Match);
30673059

30683060
if let Some(ast::Guard::If(ref expr)) = arm.guard {
30693061
self.visit_expr(expr)
@@ -3073,6 +3065,16 @@ impl<'a> Resolver<'a> {
30733065
self.ribs[ValueNS].pop();
30743066
}
30753067

3068+
/// Arising from `source`, resolve a sequence of patterns (top level or-patterns).
3069+
fn resolve_pats(&mut self, pats: &[P<Pat>], source: PatternSource) {
3070+
let mut bindings_list = FxHashMap::default();
3071+
for pat in pats {
3072+
self.resolve_pattern(pat, source, &mut bindings_list);
3073+
}
3074+
// This has to happen *after* we determine which pat_idents are variants
3075+
self.check_consistent_bindings(pats);
3076+
}
3077+
30763078
fn resolve_block(&mut self, block: &Block) {
30773079
debug!("(resolving block) entering block");
30783080
// Move down in the graph, if there's an anonymous module rooted here.
@@ -3151,8 +3153,7 @@ impl<'a> Resolver<'a> {
31513153
);
31523154
}
31533155
Some(..) if pat_src == PatternSource::Match ||
3154-
pat_src == PatternSource::IfLet ||
3155-
pat_src == PatternSource::WhileLet => {
3156+
pat_src == PatternSource::LetExpr => {
31563157
// `Variant1(a) | Variant2(a)`, ok
31573158
// Reuse definition from the first `a`.
31583159
res = self.ribs[ValueNS].last_mut().unwrap().bindings[&ident];
@@ -4345,41 +4346,26 @@ impl<'a> Resolver<'a> {
43454346
visit::walk_expr(self, expr);
43464347
}
43474348

4348-
ExprKind::IfLet(ref pats, ref subexpression, ref if_block, ref optional_else) => {
4349-
self.visit_expr(subexpression);
4349+
ExprKind::Let(ref pats, ref scrutinee) => {
4350+
self.visit_expr(scrutinee);
4351+
self.resolve_pats(pats, PatternSource::LetExpr);
4352+
}
43504353

4354+
ExprKind::If(ref cond, ref then, ref opt_else) => {
43514355
self.ribs[ValueNS].push(Rib::new(NormalRibKind));
4352-
let mut bindings_list = FxHashMap::default();
4353-
for pat in pats {
4354-
self.resolve_pattern(pat, PatternSource::IfLet, &mut bindings_list);
4355-
}
4356-
// This has to happen *after* we determine which pat_idents are variants
4357-
self.check_consistent_bindings(pats);
4358-
self.visit_block(if_block);
4356+
self.visit_expr(cond);
4357+
self.visit_block(then);
43594358
self.ribs[ValueNS].pop();
43604359

4361-
optional_else.as_ref().map(|expr| self.visit_expr(expr));
4360+
opt_else.as_ref().map(|expr| self.visit_expr(expr));
43624361
}
43634362

43644363
ExprKind::Loop(ref block, label) => self.resolve_labeled_block(label, expr.id, &block),
43654364

43664365
ExprKind::While(ref subexpression, ref block, label) => {
43674366
self.with_resolved_label(label, expr.id, |this| {
4368-
this.visit_expr(subexpression);
4369-
this.visit_block(block);
4370-
});
4371-
}
4372-
4373-
ExprKind::WhileLet(ref pats, ref subexpression, ref block, label) => {
4374-
self.with_resolved_label(label, expr.id, |this| {
4375-
this.visit_expr(subexpression);
43764367
this.ribs[ValueNS].push(Rib::new(NormalRibKind));
4377-
let mut bindings_list = FxHashMap::default();
4378-
for pat in pats {
4379-
this.resolve_pattern(pat, PatternSource::WhileLet, &mut bindings_list);
4380-
}
4381-
// This has to happen *after* we determine which pat_idents are variants.
4382-
this.check_consistent_bindings(pats);
4368+
this.visit_expr(subexpression);
43834369
this.visit_block(block);
43844370
this.ribs[ValueNS].pop();
43854371
});

0 commit comments

Comments
 (0)