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.rs55
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 }
+ }
+}