Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/builder.rs')
| -rw-r--r-- | crates/hir-ty/src/builder.rs | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/crates/hir-ty/src/builder.rs b/crates/hir-ty/src/builder.rs index 03e9443599..eec57ba3f8 100644 --- a/crates/hir-ty/src/builder.rs +++ b/crates/hir-ty/src/builder.rs @@ -18,7 +18,6 @@ use crate::{ consteval::unknown_const_as_generic, db::HirDatabase, infer::unify::InferenceTable, primitive, to_assoc_type_id, to_chalk_trait_id, utils::generics, Binders, BoundVar, CallableSig, GenericArg, Interner, ProjectionTy, Substitution, TraitRef, Ty, TyDefId, TyExt, TyKind, - ValueTyDefId, }; #[derive(Debug, Clone, PartialEq, Eq)] @@ -195,6 +194,19 @@ impl TyBuilder<()> { params.placeholder_subst(db) } + pub fn unknown_subst(db: &dyn HirDatabase, def: impl Into<GenericDefId>) -> Substitution { + let params = generics(db.upcast(), def.into()); + Substitution::from_iter( + Interner, + params.iter_id().map(|id| match id { + either::Either::Left(_) => TyKind::Error.intern(Interner).cast(Interner), + either::Either::Right(id) => { + unknown_const_as_generic(db.const_param_ty(id)).cast(Interner) + } + }), + ) + } + pub fn subst_for_def( db: &dyn HirDatabase, def: impl Into<GenericDefId>, @@ -233,6 +245,25 @@ impl TyBuilder<()> { TyBuilder::new((), params, parent_subst) } + pub fn subst_for_closure( + db: &dyn HirDatabase, + parent: DefWithBodyId, + sig_ty: Ty, + ) -> Substitution { + let sig_ty = sig_ty.cast(Interner); + let self_subst = iter::once(&sig_ty); + let Some(parent) = parent.as_generic_def_id() else { + return Substitution::from_iter(Interner, self_subst); + }; + Substitution::from_iter( + Interner, + self_subst + .chain(generics(db.upcast(), parent).placeholder_subst(db).iter(Interner)) + .cloned() + .collect::<Vec<_>>(), + ) + } + pub fn build(self) -> Substitution { let ((), subst) = self.build_internal(); subst @@ -362,21 +393,4 @@ impl TyBuilder<Binders<Ty>> { pub fn impl_self_ty(db: &dyn HirDatabase, def: hir_def::ImplId) -> TyBuilder<Binders<Ty>> { TyBuilder::subst_for_def(db, def, None).with_data(db.impl_self_ty(def)) } - - pub fn value_ty( - db: &dyn HirDatabase, - def: ValueTyDefId, - parent_subst: Option<Substitution>, - ) -> TyBuilder<Binders<Ty>> { - let poly_value_ty = db.value_ty(def); - let id = match def.to_generic_def_id() { - Some(id) => id, - None => { - // static items - assert!(parent_subst.is_none()); - return TyBuilder::new_empty(poly_value_ty); - } - }; - TyBuilder::subst_for_def(db, id, parent_subst).with_data(poly_value_ty) - } } |