1
Fork 0

Convert a closure into a method

This commit is contained in:
Oli Scherer 2021-03-10 12:36:12 +00:00
parent 40334da7a6
commit 5b6ddd5026

View file

@ -246,6 +246,18 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> {
}) })
} }
fn field_pats(
&self,
vals: impl Iterator<Item = &'tcx ty::Const<'tcx>>,
) -> Result<Vec<FieldPat<'tcx>>, FallbackToConstRef> {
vals.enumerate()
.map(|(idx, val)| {
let field = Field::new(idx);
Ok(FieldPat { field, pattern: self.recur(val, false)? })
})
.collect()
}
// Recursive helper for `to_pat`; invoke that (instead of calling this directly). // Recursive helper for `to_pat`; invoke that (instead of calling this directly).
fn recur( fn recur(
&self, &self,
@ -257,16 +269,6 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> {
let tcx = self.tcx(); let tcx = self.tcx();
let param_env = self.param_env; let param_env = self.param_env;
let field_pats = |vals: &[&'tcx ty::Const<'tcx>]| -> Result<_, _> {
vals.iter()
.enumerate()
.map(|(idx, val)| {
let field = Field::new(idx);
Ok(FieldPat { field, pattern: self.recur(val, false)? })
})
.collect()
};
let kind = match cv.ty.kind() { let kind = match cv.ty.kind() {
ty::Float(_) => { ty::Float(_) => {
tcx.struct_span_lint_hir( tcx.struct_span_lint_hir(
@ -361,12 +363,12 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> {
variant_index: destructured variant_index: destructured
.variant .variant
.expect("destructed const of adt without variant id"), .expect("destructed const of adt without variant id"),
subpatterns: field_pats(destructured.fields)?, subpatterns: self.field_pats(destructured.fields.iter().copied())?,
} }
} }
ty::Tuple(_) | ty::Adt(_, _) => { ty::Tuple(_) | ty::Adt(_, _) => {
let destructured = tcx.destructure_const(param_env.and(cv)); let destructured = tcx.destructure_const(param_env.and(cv));
PatKind::Leaf { subpatterns: field_pats(destructured.fields)? } PatKind::Leaf { subpatterns: self.field_pats(destructured.fields.iter().copied())? }
} }
ty::Array(..) => PatKind::Array { ty::Array(..) => PatKind::Array {
prefix: tcx prefix: tcx