Skip to content

Commit 74f76ae

Browse files
committed
Unify Variant and Leaf into print::PatKind::StructLike
1 parent ccfd94e commit 74f76ae

File tree

2 files changed

+25
-20
lines changed

2 files changed

+25
-20
lines changed

compiler/rustc_pattern_analysis/src/rustc.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::constructor::{
2323
};
2424
use crate::lints::lint_nonexhaustive_missing_variants;
2525
use crate::pat_column::PatternColumn;
26+
use crate::rustc::print::EnumInfo;
2627
use crate::usefulness::{compute_match_usefulness, PlaceValidity};
2728
use crate::{errors, Captures, PatCx, PrivateUninhabitedField};
2829

@@ -832,7 +833,8 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
832833
Bool(b) => PatKind::Constant { value: mir::Const::from_bool(cx.tcx, *b) },
833834
IntRange(range) => return self.hoist_pat_range(range, *pat.ty()),
834835
Struct | Variant(_) | UnionField => match pat.ty().kind() {
835-
ty::Tuple(..) => PatKind::Leaf {
836+
ty::Tuple(..) => PatKind::StructLike {
837+
enum_info: EnumInfo::NotEnum,
836838
subpatterns: subpatterns
837839
.enumerate()
838840
.map(|(i, pattern)| FieldPat { field: FieldIdx::new(i), pattern })
@@ -844,18 +846,20 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
844846
// the pattern is a box pattern.
845847
PatKind::Deref { subpattern: subpatterns.next().unwrap() }
846848
}
847-
ty::Adt(adt_def, _args) => {
848-
let variant_index = RustcPatCtxt::variant_index_for_adt(&pat.ctor(), *adt_def);
849+
&ty::Adt(adt_def, _) => {
850+
let variant_index = RustcPatCtxt::variant_index_for_adt(&pat.ctor(), adt_def);
849851
let subpatterns = subpatterns
850852
.enumerate()
851853
.map(|(i, pattern)| FieldPat { field: FieldIdx::new(i), pattern })
852854
.collect();
853855

854-
if adt_def.is_enum() {
855-
PatKind::Variant { adt_def: *adt_def, variant_index, subpatterns }
856+
let enum_info = if adt_def.is_enum() {
857+
EnumInfo::Enum { adt_def, variant_index }
856858
} else {
857-
PatKind::Leaf { subpatterns }
858-
}
859+
EnumInfo::NotEnum
860+
};
861+
862+
PatKind::StructLike { enum_info, subpatterns }
859863
}
860864
_ => bug!("unexpected ctor for type {:?} {:?}", pat.ctor(), *pat.ty()),
861865
},

compiler/rustc_pattern_analysis/src/rustc/print.rs

+14-13
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,8 @@ pub(crate) struct Pat<'tcx> {
3333
pub(crate) enum PatKind<'tcx> {
3434
Wild,
3535

36-
Variant {
37-
adt_def: AdtDef<'tcx>,
38-
variant_index: VariantIdx,
39-
subpatterns: Vec<FieldPat<'tcx>>,
40-
},
41-
42-
Leaf {
36+
StructLike {
37+
enum_info: EnumInfo<'tcx>,
4338
subpatterns: Vec<FieldPat<'tcx>>,
4439
},
4540

@@ -67,8 +62,8 @@ impl<'tcx> fmt::Display for Pat<'tcx> {
6762
match self.kind {
6863
PatKind::Wild => write!(f, "_"),
6964
PatKind::Never => write!(f, "!"),
70-
PatKind::Variant { ref subpatterns, .. } | PatKind::Leaf { ref subpatterns } => {
71-
write_struct_like(f, self.ty, &self.kind, subpatterns)
65+
PatKind::StructLike { ref enum_info, ref subpatterns } => {
66+
write_struct_like(f, self.ty, enum_info, subpatterns)
7267
}
7368
PatKind::Deref { ref subpattern } => write_ref_like(f, self.ty, subpattern),
7469
PatKind::Constant { value } => write!(f, "{value}"),
@@ -95,14 +90,20 @@ fn start_or_comma() -> impl FnMut() -> &'static str {
9590
}
9691
}
9792

93+
#[derive(Clone, Debug)]
94+
pub(crate) enum EnumInfo<'tcx> {
95+
Enum { adt_def: AdtDef<'tcx>, variant_index: VariantIdx },
96+
NotEnum,
97+
}
98+
9899
fn write_struct_like<'tcx>(
99100
f: &mut impl fmt::Write,
100101
ty: Ty<'tcx>,
101-
kind: &PatKind<'tcx>,
102+
enum_info: &EnumInfo<'tcx>,
102103
subpatterns: &[FieldPat<'tcx>],
103104
) -> fmt::Result {
104-
let variant_and_name = match *kind {
105-
PatKind::Variant { adt_def, variant_index, .. } => ty::tls::with(|tcx| {
105+
let variant_and_name = match *enum_info {
106+
EnumInfo::Enum { adt_def, variant_index } => ty::tls::with(|tcx| {
106107
let variant = adt_def.variant(variant_index);
107108
let adt_did = adt_def.did();
108109
let name = if tcx.get_diagnostic_item(sym::Option) == Some(adt_did)
@@ -114,7 +115,7 @@ fn write_struct_like<'tcx>(
114115
};
115116
Some((variant, name))
116117
}),
117-
_ => ty.ty_adt_def().and_then(|adt_def| {
118+
EnumInfo::NotEnum => ty.ty_adt_def().and_then(|adt_def| {
118119
if !adt_def.is_enum() {
119120
ty::tls::with(|tcx| {
120121
Some((adt_def.non_enum_variant(), tcx.def_path_str(adt_def.did())))

0 commit comments

Comments
 (0)