Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 52f263d

Browse files
committed
Auto merge of rust-lang#134248 - oli-obk:patkind-path-removal, r=<try>
Merge `PatKind::Path` into `PatKind::Lit` Follow-up to rust-lang#134228 We always had a duplication where `Path`s could be represented as `PatKind::Path` or `PatKind::Lit(ExprKind::Path)`. We had to handle both everywhere, and still do after rust-lang#134228, so I'm removing it now. subsequently we can also nuke `visit_pattern_type_pattern`
2 parents 67951d9 + 58d2368 commit 52f263d

File tree

37 files changed

+229
-154
lines changed

37 files changed

+229
-154
lines changed

compiler/rustc_ast_lowering/src/expr.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1391,7 +1391,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
13911391
None,
13921392
);
13931393
// Destructure like a unit struct.
1394-
let unit_struct_pat = hir::PatKind::Path(qpath);
1394+
let unit_struct_pat = hir::PatKind::Expr(self.arena.alloc(hir::PatExpr {
1395+
hir_id: self.lower_node_id(lhs.id),
1396+
span: lhs.span,
1397+
kind: hir::PatExprKind::Path(qpath),
1398+
}));
13951399
return self.pat_without_dbm(lhs.span, unit_struct_pat);
13961400
}
13971401
}

compiler/rustc_ast_lowering/src/pat.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
6969
ImplTraitContext::Disallowed(ImplTraitPosition::Path),
7070
None,
7171
);
72-
break hir::PatKind::Path(qpath);
72+
let kind = hir::PatExprKind::Path(qpath);
73+
let expr = hir::PatExpr { hir_id: pat_hir_id, span: pattern.span, kind };
74+
let expr = self.arena.alloc(expr);
75+
return hir::Pat {
76+
hir_id: self.next_id(),
77+
kind: hir::PatKind::Expr(expr),
78+
span: pattern.span,
79+
default_binding_modes: true,
80+
};
7381
}
7482
PatKind::Struct(qself, path, fields, etc) => {
7583
let qpath = self.lower_qpath(
@@ -306,14 +314,17 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
306314
Some(res) => {
307315
let hir_id = self.next_id();
308316
let res = self.lower_res(res);
309-
hir::PatKind::Path(hir::QPath::Resolved(
317+
let kind = hir::PatExprKind::Path(hir::QPath::Resolved(
310318
None,
311319
self.arena.alloc(hir::Path {
312320
span: self.lower_span(ident.span),
313321
res,
314322
segments: arena_vec![self; hir::PathSegment::new(self.lower_ident(ident), hir_id, res)],
315323
}),
316-
))
324+
));
325+
let lit = hir::PatExpr { kind, hir_id: self.next_id(), span: ident.span };
326+
let lit = self.arena.alloc(lit);
327+
hir::PatKind::Expr(lit)
317328
}
318329
}
319330
}

compiler/rustc_hir/src/hir.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,7 +1386,7 @@ impl<'hir> Pat<'hir> {
13861386

13871387
use PatKind::*;
13881388
match self.kind {
1389-
Wild | Never | Expr(_) | Range(..) | Binding(.., None) | Path(_) | Err(_) => true,
1389+
Wild | Never | Expr(_) | Range(..) | Binding(.., None) | Err(_) => true,
13901390
Box(s) | Deref(s) | Ref(s, _) | Binding(.., Some(s)) | Guard(s, _) => s.walk_short_(it),
13911391
Struct(_, fields, _) => fields.iter().all(|field| field.pat.walk_short_(it)),
13921392
TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().all(|p| p.walk_short_(it)),
@@ -1413,7 +1413,7 @@ impl<'hir> Pat<'hir> {
14131413

14141414
use PatKind::*;
14151415
match self.kind {
1416-
Wild | Never | Expr(_) | Range(..) | Binding(.., None) | Path(_) | Err(_) => {}
1416+
Wild | Never | Expr(_) | Range(..) | Binding(.., None) | Err(_) => {}
14171417
Box(s) | Deref(s) | Ref(s, _) | Binding(.., Some(s)) | Guard(s, _) => s.walk_(it),
14181418
Struct(_, fields, _) => fields.iter().for_each(|field| field.pat.walk_(it)),
14191419
TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().for_each(|p| p.walk_(it)),
@@ -1521,6 +1521,7 @@ impl fmt::Debug for DotDotPos {
15211521

15221522
#[derive(Debug, Clone, Copy, HashStable_Generic)]
15231523
pub struct PatExpr<'hir> {
1524+
#[stable_hasher(ignore)]
15241525
pub hir_id: HirId,
15251526
pub span: Span,
15261527
pub kind: PatExprKind<'hir>,
@@ -1566,9 +1567,6 @@ pub enum PatKind<'hir> {
15661567
/// A never pattern `!`.
15671568
Never,
15681569

1569-
/// A path pattern for a unit struct/variant or a (maybe-associated) constant.
1570-
Path(QPath<'hir>),
1571-
15721570
/// A tuple pattern (e.g., `(a, b)`).
15731571
/// If the `..` pattern fragment is present, then `Option<usize>` denotes its position.
15741572
/// `0 <= position <= subpats.len()`

compiler/rustc_hir/src/intravisit.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -668,9 +668,6 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat<'v>) -> V:
668668
try_visit!(visitor.visit_qpath(qpath, pattern.hir_id, pattern.span));
669669
walk_list!(visitor, visit_pat, children);
670670
}
671-
PatKind::Path(ref qpath) => {
672-
try_visit!(visitor.visit_qpath(qpath, pattern.hir_id, pattern.span));
673-
}
674671
PatKind::Struct(ref qpath, fields, _) => {
675672
try_visit!(visitor.visit_qpath(qpath, pattern.hir_id, pattern.span));
676673
walk_list!(visitor, visit_pat_field, fields);

compiler/rustc_hir/src/pat_util.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,10 @@ impl hir::Pat<'_> {
105105
let mut variants = vec![];
106106
self.walk(|p| match &p.kind {
107107
PatKind::Or(_) => false,
108-
PatKind::Path(hir::QPath::Resolved(_, path))
108+
PatKind::Expr(hir::PatExpr {
109+
kind: hir::PatExprKind::Path(hir::QPath::Resolved(_, path)),
110+
..
111+
})
109112
| PatKind::TupleStruct(hir::QPath::Resolved(_, path), ..)
110113
| PatKind::Struct(hir::QPath::Resolved(_, path), ..) => {
111114
if let Res::Def(DefKind::Variant | DefKind::Ctor(CtorOf::Variant, ..), id) =

compiler/rustc_hir_analysis/src/check/region.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,6 @@ fn resolve_local<'tcx>(
703703
| PatKind::Binding(hir::BindingMode(hir::ByRef::No, _), ..)
704704
| PatKind::Wild
705705
| PatKind::Never
706-
| PatKind::Path(_)
707706
| PatKind::Expr(_)
708707
| PatKind::Range(_, _, _)
709708
| PatKind::Err(_) => false,

compiler/rustc_hir_analysis/src/hir_ty_lowering/lint.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
3636
kind: hir::ExprKind::Path(hir::QPath::TypeRelative(qself, _)),
3737
..
3838
})
39-
| hir::Node::Pat(hir::Pat {
40-
kind: hir::PatKind::Path(hir::QPath::TypeRelative(qself, _)),
39+
| hir::Node::PatExpr(hir::PatExpr {
40+
kind: hir::PatExprKind::Path(hir::QPath::TypeRelative(qself, _)),
4141
..
4242
}) if qself.hir_id == self_ty.hir_id => true,
4343
_ => false,

compiler/rustc_hir_pretty/src/lib.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,9 +1905,6 @@ impl<'a> State<'a> {
19051905
}
19061906
self.pclose();
19071907
}
1908-
PatKind::Path(ref qpath) => {
1909-
self.print_qpath(qpath, true);
1910-
}
19111908
PatKind::Struct(ref qpath, fields, etc) => {
19121909
self.print_qpath(qpath, true);
19131910
self.nbsp();

compiler/rustc_hir_typeck/src/expr.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
480480
hir::PatKind::Binding(_, _, _, _)
481481
| hir::PatKind::Struct(_, _, _)
482482
| hir::PatKind::TupleStruct(_, _, _)
483-
| hir::PatKind::Path(_)
484483
| hir::PatKind::Tuple(_, _)
485484
| hir::PatKind::Box(_)
486485
| hir::PatKind::Ref(_, _)

compiler/rustc_hir_typeck/src/expr_use_visitor.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@ use hir::def::DefKind;
1111
use hir::pat_util::EnumerateAndAdjustIterator as _;
1212
use rustc_abi::{FIRST_VARIANT, FieldIdx, VariantIdx};
1313
use rustc_data_structures::fx::FxIndexMap;
14-
use rustc_hir as hir;
1514
use rustc_hir::def::{CtorOf, Res};
1615
use rustc_hir::def_id::LocalDefId;
17-
use rustc_hir::{HirId, PatKind};
16+
use rustc_hir::{self as hir, HirId, PatExpr, PatExprKind, PatKind};
1817
use rustc_lint::LateContext;
1918
use rustc_middle::hir::place::ProjectionKind;
2019
// Export these here so that Clippy can use them.
@@ -564,11 +563,11 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
564563
// FIXME(never_patterns): does this do what I expect?
565564
needs_to_be_read = true;
566565
}
567-
PatKind::Path(qpath) => {
566+
PatKind::Expr(PatExpr { kind: PatExprKind::Path(qpath), hir_id, .. }) => {
568567
// A `Path` pattern is just a name like `Foo`. This is either a
569568
// named constant or else it refers to an ADT variant
570569

571-
let res = self.cx.typeck_results().qpath_res(qpath, pat.hir_id);
570+
let res = self.cx.typeck_results().qpath_res(qpath, *hir_id);
572571
match res {
573572
Res::Def(DefKind::Const, _) | Res::Def(DefKind::AssocConst, _) => {
574573
// Named constants have to be equated with the value
@@ -1801,8 +1800,7 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
18011800
}
18021801
}
18031802

1804-
PatKind::Path(_)
1805-
| PatKind::Binding(.., None)
1803+
PatKind::Binding(.., None)
18061804
| PatKind::Expr(..)
18071805
| PatKind::Range(..)
18081806
| PatKind::Never

0 commit comments

Comments
 (0)