Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/infer/resolve.rs')
| -rw-r--r-- | crates/hir-ty/src/next_solver/infer/resolve.rs | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/crates/hir-ty/src/next_solver/infer/resolve.rs b/crates/hir-ty/src/next_solver/infer/resolve.rs index 84338ade6e..b6e5225e5a 100644 --- a/crates/hir-ty/src/next_solver/infer/resolve.rs +++ b/crates/hir-ty/src/next_solver/infer/resolve.rs @@ -1,14 +1,14 @@ //! Things for resolving vars in the infer context of the next-trait-solver. use rustc_type_ir::{ - ConstKind, FallibleTypeFolder, InferConst, InferTy, RegionKind, TyKind, TypeFoldable, - TypeFolder, TypeSuperFoldable, TypeVisitableExt, data_structures::DelayedMap, - inherent::IntoKind, + TypeFolder, TypeSuperFoldable, TypeVisitableExt, + data_structures::DelayedMap, + inherent::{Const as _, Ty as _}, }; -use crate::next_solver::{Const, DbInterner, Region, Ty}; +use crate::next_solver::{Const, DbInterner, ErrorGuaranteed, Region, Ty}; -use super::{FixupError, FixupResult, InferCtxt}; +use super::InferCtxt; /////////////////////////////////////////////////////////////////////////// // OPPORTUNISTIC VAR RESOLVER @@ -60,3 +60,48 @@ impl<'a, 'db> TypeFolder<DbInterner<'db>> for OpportunisticVarResolver<'a, 'db> } } } + +pub struct ReplaceInferWithError<'db> { + interner: DbInterner<'db>, +} + +impl<'db> ReplaceInferWithError<'db> { + #[inline] + pub fn new(interner: DbInterner<'db>) -> Self { + Self { interner } + } +} + +impl<'db> TypeFolder<DbInterner<'db>> for ReplaceInferWithError<'db> { + fn cx(&self) -> DbInterner<'db> { + self.interner + } + + fn fold_ty(&mut self, t: Ty<'db>) -> Ty<'db> { + if !t.has_infer() { + return t; + } + + if t.is_infer() { + Ty::new_error(self.interner, ErrorGuaranteed) + } else { + t.super_fold_with(self) + } + } + + fn fold_const(&mut self, c: Const<'db>) -> Const<'db> { + if !c.has_infer() { + return c; + } + + if c.is_ct_infer() { + Const::new_error(self.interner, ErrorGuaranteed) + } else { + c.super_fold_with(self) + } + } + + fn fold_region(&mut self, r: Region<'db>) -> Region<'db> { + if r.is_var() { Region::error(self.interner) } else { r } + } +} |