Unify Variant
and Leaf
into print::PatKind::StructLike
This commit is contained in:
parent
ccfd94e334
commit
74f76ae5ea
2 changed files with 25 additions and 20 deletions
|
@ -23,6 +23,7 @@ use crate::constructor::{
|
||||||
};
|
};
|
||||||
use crate::lints::lint_nonexhaustive_missing_variants;
|
use crate::lints::lint_nonexhaustive_missing_variants;
|
||||||
use crate::pat_column::PatternColumn;
|
use crate::pat_column::PatternColumn;
|
||||||
|
use crate::rustc::print::EnumInfo;
|
||||||
use crate::usefulness::{compute_match_usefulness, PlaceValidity};
|
use crate::usefulness::{compute_match_usefulness, PlaceValidity};
|
||||||
use crate::{errors, Captures, PatCx, PrivateUninhabitedField};
|
use crate::{errors, Captures, PatCx, PrivateUninhabitedField};
|
||||||
|
|
||||||
|
@ -832,7 +833,8 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
|
||||||
Bool(b) => PatKind::Constant { value: mir::Const::from_bool(cx.tcx, *b) },
|
Bool(b) => PatKind::Constant { value: mir::Const::from_bool(cx.tcx, *b) },
|
||||||
IntRange(range) => return self.hoist_pat_range(range, *pat.ty()),
|
IntRange(range) => return self.hoist_pat_range(range, *pat.ty()),
|
||||||
Struct | Variant(_) | UnionField => match pat.ty().kind() {
|
Struct | Variant(_) | UnionField => match pat.ty().kind() {
|
||||||
ty::Tuple(..) => PatKind::Leaf {
|
ty::Tuple(..) => PatKind::StructLike {
|
||||||
|
enum_info: EnumInfo::NotEnum,
|
||||||
subpatterns: subpatterns
|
subpatterns: subpatterns
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, pattern)| FieldPat { field: FieldIdx::new(i), pattern })
|
.map(|(i, pattern)| FieldPat { field: FieldIdx::new(i), pattern })
|
||||||
|
@ -844,18 +846,20 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
|
||||||
// the pattern is a box pattern.
|
// the pattern is a box pattern.
|
||||||
PatKind::Deref { subpattern: subpatterns.next().unwrap() }
|
PatKind::Deref { subpattern: subpatterns.next().unwrap() }
|
||||||
}
|
}
|
||||||
ty::Adt(adt_def, _args) => {
|
&ty::Adt(adt_def, _) => {
|
||||||
let variant_index = RustcPatCtxt::variant_index_for_adt(&pat.ctor(), *adt_def);
|
let variant_index = RustcPatCtxt::variant_index_for_adt(&pat.ctor(), adt_def);
|
||||||
let subpatterns = subpatterns
|
let subpatterns = subpatterns
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, pattern)| FieldPat { field: FieldIdx::new(i), pattern })
|
.map(|(i, pattern)| FieldPat { field: FieldIdx::new(i), pattern })
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
if adt_def.is_enum() {
|
let enum_info = if adt_def.is_enum() {
|
||||||
PatKind::Variant { adt_def: *adt_def, variant_index, subpatterns }
|
EnumInfo::Enum { adt_def, variant_index }
|
||||||
} else {
|
} else {
|
||||||
PatKind::Leaf { subpatterns }
|
EnumInfo::NotEnum
|
||||||
}
|
};
|
||||||
|
|
||||||
|
PatKind::StructLike { enum_info, subpatterns }
|
||||||
}
|
}
|
||||||
_ => bug!("unexpected ctor for type {:?} {:?}", pat.ctor(), *pat.ty()),
|
_ => bug!("unexpected ctor for type {:?} {:?}", pat.ctor(), *pat.ty()),
|
||||||
},
|
},
|
||||||
|
|
|
@ -33,13 +33,8 @@ pub(crate) struct Pat<'tcx> {
|
||||||
pub(crate) enum PatKind<'tcx> {
|
pub(crate) enum PatKind<'tcx> {
|
||||||
Wild,
|
Wild,
|
||||||
|
|
||||||
Variant {
|
StructLike {
|
||||||
adt_def: AdtDef<'tcx>,
|
enum_info: EnumInfo<'tcx>,
|
||||||
variant_index: VariantIdx,
|
|
||||||
subpatterns: Vec<FieldPat<'tcx>>,
|
|
||||||
},
|
|
||||||
|
|
||||||
Leaf {
|
|
||||||
subpatterns: Vec<FieldPat<'tcx>>,
|
subpatterns: Vec<FieldPat<'tcx>>,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -67,8 +62,8 @@ impl<'tcx> fmt::Display for Pat<'tcx> {
|
||||||
match self.kind {
|
match self.kind {
|
||||||
PatKind::Wild => write!(f, "_"),
|
PatKind::Wild => write!(f, "_"),
|
||||||
PatKind::Never => write!(f, "!"),
|
PatKind::Never => write!(f, "!"),
|
||||||
PatKind::Variant { ref subpatterns, .. } | PatKind::Leaf { ref subpatterns } => {
|
PatKind::StructLike { ref enum_info, ref subpatterns } => {
|
||||||
write_struct_like(f, self.ty, &self.kind, subpatterns)
|
write_struct_like(f, self.ty, enum_info, subpatterns)
|
||||||
}
|
}
|
||||||
PatKind::Deref { ref subpattern } => write_ref_like(f, self.ty, subpattern),
|
PatKind::Deref { ref subpattern } => write_ref_like(f, self.ty, subpattern),
|
||||||
PatKind::Constant { value } => write!(f, "{value}"),
|
PatKind::Constant { value } => write!(f, "{value}"),
|
||||||
|
@ -95,14 +90,20 @@ fn start_or_comma() -> impl FnMut() -> &'static str {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub(crate) enum EnumInfo<'tcx> {
|
||||||
|
Enum { adt_def: AdtDef<'tcx>, variant_index: VariantIdx },
|
||||||
|
NotEnum,
|
||||||
|
}
|
||||||
|
|
||||||
fn write_struct_like<'tcx>(
|
fn write_struct_like<'tcx>(
|
||||||
f: &mut impl fmt::Write,
|
f: &mut impl fmt::Write,
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
kind: &PatKind<'tcx>,
|
enum_info: &EnumInfo<'tcx>,
|
||||||
subpatterns: &[FieldPat<'tcx>],
|
subpatterns: &[FieldPat<'tcx>],
|
||||||
) -> fmt::Result {
|
) -> fmt::Result {
|
||||||
let variant_and_name = match *kind {
|
let variant_and_name = match *enum_info {
|
||||||
PatKind::Variant { adt_def, variant_index, .. } => ty::tls::with(|tcx| {
|
EnumInfo::Enum { adt_def, variant_index } => ty::tls::with(|tcx| {
|
||||||
let variant = adt_def.variant(variant_index);
|
let variant = adt_def.variant(variant_index);
|
||||||
let adt_did = adt_def.did();
|
let adt_did = adt_def.did();
|
||||||
let name = if tcx.get_diagnostic_item(sym::Option) == Some(adt_did)
|
let name = if tcx.get_diagnostic_item(sym::Option) == Some(adt_did)
|
||||||
|
@ -114,7 +115,7 @@ fn write_struct_like<'tcx>(
|
||||||
};
|
};
|
||||||
Some((variant, name))
|
Some((variant, name))
|
||||||
}),
|
}),
|
||||||
_ => ty.ty_adt_def().and_then(|adt_def| {
|
EnumInfo::NotEnum => ty.ty_adt_def().and_then(|adt_def| {
|
||||||
if !adt_def.is_enum() {
|
if !adt_def.is_enum() {
|
||||||
ty::tls::with(|tcx| {
|
ty::tls::with(|tcx| {
|
||||||
Some((adt_def.non_enum_variant(), tcx.def_path_str(adt_def.did())))
|
Some((adt_def.non_enum_variant(), tcx.def_path_str(adt_def.did())))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue