Skip to content

Commit 140b6ba

Browse files
committed
add guard pattern AST node
1 parent c886490 commit 140b6ba

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
@@ -1366,6 +1366,10 @@ pub fn walk_pat<T: MutVisitor>(vis: &mut T, pat: &mut P<Pat>) {
13661366
visit_opt(e2, |e| vis.visit_expr(e));
13671367
vis.visit_span(span);
13681368
}
1369+
PatKind::Guard(p, e) => {
1370+
vis.visit_pat(p);
1371+
vis.visit_expr(e);
1372+
}
13691373
PatKind::Tuple(elems) | PatKind::Slice(elems) | PatKind::Or(elems) => {
13701374
visit_thin_vec(elems, |elem| vis.visit_pat(elem))
13711375
}

compiler/rustc_ast/src/visit.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,10 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) -> V::Res
670670
visit_opt!(visitor, visit_expr, lower_bound);
671671
visit_opt!(visitor, visit_expr, upper_bound);
672672
}
673+
PatKind::Guard(subpattern, guard_condition) => {
674+
try_visit!(visitor.visit_pat(subpattern));
675+
try_visit!(visitor.visit_expr(guard_condition));
676+
}
673677
PatKind::Wild | PatKind::Rest | PatKind::Never => {}
674678
PatKind::Err(_guar) => {}
675679
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
@@ -114,6 +114,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
114114
self.lower_range_end(end, e2.is_some()),
115115
);
116116
}
117+
PatKind::Guard(_, _) => todo!("implement lowering to HIR"),
117118
PatKind::Slice(pats) => break self.lower_pat_slice(pats),
118119
PatKind::Rest => {
119120
// 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
@@ -1710,6 +1710,12 @@ impl<'a> State<'a> {
17101710
self.print_expr(e, FixupContext::default());
17111711
}
17121712
}
1713+
PatKind::Guard(subpat, condition) => {
1714+
self.print_pat(subpat);
1715+
self.space();
1716+
self.word_space("if");
1717+
self.print_expr(condition, FixupContext::default());
1718+
}
17131719
PatKind::Slice(elts) => {
17141720
self.word("[");
17151721
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
@@ -1226,7 +1226,7 @@ impl EarlyLintPass for UnusedParens {
12261226
self.check_unused_parens_pat(cx, &f.pat, false, false, keep_space);
12271227
},
12281228
// Avoid linting on `i @ (p0 | .. | pn)` and `box (p0 | .. | pn)`, #64106.
1229-
Ident(.., Some(p)) | Box(p) | Deref(p) => self.check_unused_parens_pat(cx, p, true, false, keep_space),
1229+
Ident(.., Some(p)) | Box(p) | Deref(p) | Guard(p, _) => self.check_unused_parens_pat(cx, p, true, false, keep_space),
12301230
// Avoid linting on `&(mut x)` as `&mut x` has a different meaning, #55342.
12311231
// Also avoid linting on `& mut? (p0 | .. | pn)`, #64106.
12321232
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
@@ -553,6 +553,7 @@ impl<'v> ast_visit::Visitor<'v> for StatCollector<'v> {
553553
Slice,
554554
Rest,
555555
Never,
556+
Guard,
556557
Paren,
557558
MacCall,
558559
Err

0 commit comments

Comments
 (0)