Adapt TypeFolder implementors to return a Result
Co-authored-by: Alan Egerton <eggyal@gmail.com>
This commit is contained in:
committed by
Alan Egerton
parent
6e3fa20b00
commit
6dc3dae46f
@@ -605,13 +605,13 @@ impl<'tcx> TypeFolder<'tcx> for OpaqueTypeExpander<'tcx> {
|
||||
self.tcx
|
||||
}
|
||||
|
||||
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
||||
fn fold_ty(&mut self, t: Ty<'tcx>) -> Result<Ty<'tcx>, Self::Error> {
|
||||
if let ty::Opaque(def_id, substs) = t.kind {
|
||||
self.expand_opaque_ty(def_id, substs).unwrap_or(t)
|
||||
Ok(self.expand_opaque_ty(def_id, substs).unwrap_or(t))
|
||||
} else if t.has_opaque_types() {
|
||||
t.super_fold_with(self)
|
||||
} else {
|
||||
t
|
||||
Ok(t)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1046,25 +1046,31 @@ pub fn fold_list<'tcx, F, T>(
|
||||
list: &'tcx ty::List<T>,
|
||||
folder: &mut F,
|
||||
intern: impl FnOnce(TyCtxt<'tcx>, &[T]) -> &'tcx ty::List<T>,
|
||||
) -> &'tcx ty::List<T>
|
||||
) -> Result<&'tcx ty::List<T>, F::Error>
|
||||
where
|
||||
F: TypeFolder<'tcx>,
|
||||
T: TypeFoldable<'tcx> + PartialEq + Copy,
|
||||
{
|
||||
let mut iter = list.iter();
|
||||
// Look for the first element that changed
|
||||
if let Some((i, new_t)) = iter.by_ref().enumerate().find_map(|(i, t)| {
|
||||
let new_t = t.fold_with(folder);
|
||||
if new_t == t { None } else { Some((i, new_t)) }
|
||||
match iter.by_ref().enumerate().find_map(|(i, t)| match t.fold_with(folder) {
|
||||
Ok(new_t) if new_t == t => None,
|
||||
new_t => Some((i, new_t)),
|
||||
}) {
|
||||
// An element changed, prepare to intern the resulting list
|
||||
let mut new_list = SmallVec::<[_; 8]>::with_capacity(list.len());
|
||||
new_list.extend_from_slice(&list[..i]);
|
||||
new_list.push(new_t);
|
||||
new_list.extend(iter.map(|t| t.fold_with(folder)));
|
||||
intern(folder.tcx(), &new_list)
|
||||
} else {
|
||||
list
|
||||
Some((i, Ok(new_t))) => {
|
||||
// An element changed, prepare to intern the resulting list
|
||||
let mut new_list = SmallVec::<[_; 8]>::with_capacity(list.len());
|
||||
new_list.extend_from_slice(&list[..i]);
|
||||
new_list.push(new_t);
|
||||
for t in iter {
|
||||
new_list.push(t.fold_with(folder)?)
|
||||
}
|
||||
Ok(intern(folder.tcx(), &new_list))
|
||||
}
|
||||
Some((_, Err(err))) => {
|
||||
return Err(err);
|
||||
}
|
||||
None => Ok(list),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user