Skip to content

Commit 8213252

Browse files
committed
add guard pattern AST node
1 parent 4573c92 commit 8213252

File tree

7 files changed

+25
-4
lines changed

7 files changed

+25
-4
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -626,9 +626,11 @@ impl Pat {
626626
| PatKind::Or(s) => s.iter().for_each(|p| p.walk(it)),
627627

628628
// Trivial wrappers over inner patterns.
629-
PatKind::Box(s) | PatKind::Deref(s) | PatKind::Ref(s, _) | PatKind::Paren(s) => {
630-
s.walk(it)
631-
}
629+
PatKind::Box(s)
630+
| PatKind::Deref(s)
631+
| PatKind::Ref(s, _)
632+
| PatKind::Paren(s)
633+
| PatKind::Guard(s, _) => s.walk(it),
632634

633635
// These patterns do not contain subpatterns, skip.
634636
PatKind::Wild
@@ -838,6 +840,9 @@ pub enum PatKind {
838840
// A never pattern `!`.
839841
Never,
840842

843+
/// A guard pattern (e.g., `x if guard(x)`).
844+
Guard(P<Pat>, P<Expr>),
845+
841846
/// Parentheses in patterns used for grouping (i.e., `(PAT)`).
842847
Paren(P<Pat>),
843848

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,10 @@ pub fn walk_pat<T: MutVisitor>(vis: &mut T, pat: &mut P<Pat>) {
13701370
visit_opt(e2, |e| vis.visit_expr(e));
13711371
vis.visit_span(span);
13721372
}
1373+
PatKind::Guard(p, e) => {
1374+
vis.visit_pat(p);
1375+
vis.visit_expr(e);
1376+
}
13731377
PatKind::Tuple(elems) | PatKind::Slice(elems) | PatKind::Or(elems) => {
13741378
visit_thin_vec(elems, |elem| vis.visit_pat(elem))
13751379
}

compiler/rustc_ast/src/visit.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,10 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) -> V::Res
675675
visit_opt!(visitor, visit_expr, lower_bound);
676676
visit_opt!(visitor, visit_expr, upper_bound);
677677
}
678+
PatKind::Guard(subpattern, guard_condition) => {
679+
try_visit!(visitor.visit_pat(subpattern));
680+
try_visit!(visitor.visit_expr(guard_condition));
681+
}
678682
PatKind::Wild | PatKind::Rest | PatKind::Never => {}
679683
PatKind::Err(_guar) => {}
680684
PatKind::Tuple(elems) | PatKind::Slice(elems) | PatKind::Or(elems) => {

compiler/rustc_ast_lowering/src/pat.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
104104
self.lower_range_end(end, e2.is_some()),
105105
);
106106
}
107+
PatKind::Guard(_, _) => todo!("implement lowering to HIR"),
107108
PatKind::Slice(pats) => break self.lower_pat_slice(pats),
108109
PatKind::Rest => {
109110
// If we reach here the `..` pattern is not semantically allowed.

compiler/rustc_ast_pretty/src/pprust/state.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,6 +1673,12 @@ impl<'a> State<'a> {
16731673
self.print_expr(e, FixupContext::default());
16741674
}
16751675
}
1676+
PatKind::Guard(subpat, condition) => {
1677+
self.print_pat(subpat);
1678+
self.space();
1679+
self.word_space("if");
1680+
self.print_expr(condition, FixupContext::default());
1681+
}
16761682
PatKind::Slice(elts) => {
16771683
self.word("[");
16781684
self.commasep(Inconsistent, elts, |s, p| s.print_pat(p));

compiler/rustc_lint/src/unused.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1227,7 +1227,7 @@ impl EarlyLintPass for UnusedParens {
12271227
self.check_unused_parens_pat(cx, &f.pat, false, false, keep_space);
12281228
},
12291229
// Avoid linting on `i @ (p0 | .. | pn)` and `box (p0 | .. | pn)`, #64106.
1230-
Ident(.., Some(p)) | Box(p) | Deref(p) => self.check_unused_parens_pat(cx, p, true, false, keep_space),
1230+
Ident(.., Some(p)) | Box(p) | Deref(p) | Guard(p, _) => self.check_unused_parens_pat(cx, p, true, false, keep_space),
12311231
// Avoid linting on `&(mut x)` as `&mut x` has a different meaning, #55342.
12321232
// Also avoid linting on `& mut? (p0 | .. | pn)`, #64106.
12331233
Ref(p, m) => self.check_unused_parens_pat(cx, p, true, *m == Mutability::Not, keep_space),

compiler/rustc_passes/src/hir_stats.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ impl<'v> ast_visit::Visitor<'v> for StatCollector<'v> {
574574
Slice,
575575
Rest,
576576
Never,
577+
Guard,
577578
Paren,
578579
MacCall,
579580
Err

0 commit comments

Comments
 (0)