Replace remaining uses of Substitution::build_for_def
This commit is contained in:
parent
77333a571f
commit
5d2b488aeb
6 changed files with 46 additions and 21 deletions
|
@ -1702,10 +1702,9 @@ impl Type {
|
||||||
fn from_def(
|
fn from_def(
|
||||||
db: &dyn HirDatabase,
|
db: &dyn HirDatabase,
|
||||||
krate: CrateId,
|
krate: CrateId,
|
||||||
def: impl HasResolver + Into<TyDefId> + Into<GenericDefId>,
|
def: impl HasResolver + Into<TyDefId>,
|
||||||
) -> Type {
|
) -> Type {
|
||||||
let substs = Substitution::build_for_def(db, def).fill_with_unknown().build();
|
let ty = TyBuilder::def_ty(db, def.into()).fill_with_unknown().build();
|
||||||
let ty = db.ty(def.into()).subst(&substs);
|
|
||||||
Type::new(db, krate, def, ty)
|
Type::new(db, krate, def, ty)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -514,10 +514,9 @@ impl<'a> InferenceContext<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TypeNs::TypeAliasId(it) => {
|
TypeNs::TypeAliasId(it) => {
|
||||||
let substs = Substitution::build_for_def(self.db, it)
|
let ty = TyBuilder::def_ty(self.db, it.into())
|
||||||
.fill(std::iter::repeat_with(|| self.table.new_type_var()))
|
.fill(std::iter::repeat_with(|| self.table.new_type_var()))
|
||||||
.build();
|
.build();
|
||||||
let ty = self.db.ty(it.into()).subst(&substs);
|
|
||||||
let variant = ty_variant(&ty);
|
let variant = ty_variant(&ty);
|
||||||
forbid_unresolved_segments((ty, variant), unresolved)
|
forbid_unresolved_segments((ty, variant), unresolved)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,10 +7,7 @@
|
||||||
use chalk_ir::{cast::Cast, Mutability, TyVariableKind};
|
use chalk_ir::{cast::Cast, Mutability, TyVariableKind};
|
||||||
use hir_def::lang_item::LangItemTarget;
|
use hir_def::lang_item::LangItemTarget;
|
||||||
|
|
||||||
use crate::{
|
use crate::{autoderef, traits::Solution, Interner, Ty, TyBuilder, TyKind};
|
||||||
autoderef, traits::Solution, Interner, Ty,
|
|
||||||
TyBuilder, TyKind,
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::{InEnvironment, InferenceContext};
|
use super::{InEnvironment, InferenceContext};
|
||||||
|
|
||||||
|
|
|
@ -243,7 +243,7 @@ impl<'a> InferenceContext<'a> {
|
||||||
};
|
};
|
||||||
let substs = match container {
|
let substs = match container {
|
||||||
AssocContainerId::ImplId(impl_id) => {
|
AssocContainerId::ImplId(impl_id) => {
|
||||||
let impl_substs = Substitution::build_for_def(self.db, impl_id)
|
let impl_substs = TyBuilder::subst_for_def(self.db, impl_id)
|
||||||
.fill(iter::repeat_with(|| self.table.new_type_var()))
|
.fill(iter::repeat_with(|| self.table.new_type_var()))
|
||||||
.build();
|
.build();
|
||||||
let impl_self_ty = self.db.impl_self_ty(impl_id).subst(&impl_substs);
|
let impl_self_ty = self.db.impl_self_ty(impl_id).subst(&impl_substs);
|
||||||
|
|
|
@ -28,7 +28,10 @@ mod chalk_ext;
|
||||||
use std::{iter, mem, sync::Arc};
|
use std::{iter, mem, sync::Arc};
|
||||||
|
|
||||||
use base_db::salsa;
|
use base_db::salsa;
|
||||||
use chalk_ir::cast::{CastTo, Caster};
|
use chalk_ir::{
|
||||||
|
cast::{CastTo, Caster},
|
||||||
|
interner::HasInterner,
|
||||||
|
};
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
builtin_type::BuiltinType, expr::ExprId, type_ref::Rawness, AssocContainerId, FunctionId,
|
builtin_type::BuiltinType, expr::ExprId, type_ref::Rawness, AssocContainerId, FunctionId,
|
||||||
GenericDefId, HasModule, LifetimeParamId, Lookup, TraitId, TypeAliasId, TypeParamId,
|
GenericDefId, HasModule, LifetimeParamId, Lookup, TraitId, TypeAliasId, TypeParamId,
|
||||||
|
@ -490,13 +493,6 @@ impl Substitution {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_for_def(db: &dyn HirDatabase, def: impl Into<GenericDefId>) -> SubstsBuilder {
|
|
||||||
let def = def.into();
|
|
||||||
let params = generics(db.upcast(), def);
|
|
||||||
let param_count = params.len();
|
|
||||||
Substitution::builder(param_count)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn build_for_generics(generic_params: &Generics) -> SubstsBuilder {
|
pub(crate) fn build_for_generics(generic_params: &Generics) -> SubstsBuilder {
|
||||||
Substitution::builder(generic_params.len())
|
Substitution::builder(generic_params.len())
|
||||||
}
|
}
|
||||||
|
@ -894,6 +890,18 @@ impl TyBuilder<()> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn subst_for_def(db: &dyn HirDatabase, def: impl Into<GenericDefId>) -> TyBuilder<()> {
|
||||||
|
let def = def.into();
|
||||||
|
let params = generics(db.upcast(), def);
|
||||||
|
let param_count = params.len();
|
||||||
|
TyBuilder::new((), param_count)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build(self) -> Substitution {
|
||||||
|
let ((), subst) = self.build_internal();
|
||||||
|
subst
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TyBuilder<hir_def::AdtId> {
|
impl TyBuilder<hir_def::AdtId> {
|
||||||
|
@ -956,6 +964,28 @@ impl TyBuilder<TypeAliasId> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: TypeWalk + HasInterner<Interner = Interner>> TyBuilder<Binders<T>> {
|
||||||
|
fn subst_binders(b: Binders<T>) -> Self {
|
||||||
|
let param_count = b.num_binders;
|
||||||
|
TyBuilder::new(b, param_count)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build(self) -> T {
|
||||||
|
let (b, subst) = self.build_internal();
|
||||||
|
b.subst(&subst)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TyBuilder<Binders<Ty>> {
|
||||||
|
pub fn def_ty(db: &dyn HirDatabase, def: TyDefId) -> TyBuilder<Binders<Ty>> {
|
||||||
|
TyBuilder::subst_binders(db.ty(def.into()))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn impl_self_ty(db: &dyn HirDatabase, def: hir_def::ImplId) -> TyBuilder<Binders<Ty>> {
|
||||||
|
TyBuilder::subst_binders(db.impl_self_ty(def))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Ty {
|
impl Ty {
|
||||||
pub fn as_reference(&self) -> Option<(&Ty, Mutability)> {
|
pub fn as_reference(&self) -> Option<(&Ty, Mutability)> {
|
||||||
match self.kind(&Interner) {
|
match self.kind(&Interner) {
|
||||||
|
|
|
@ -709,7 +709,7 @@ pub(crate) fn inherent_impl_substs(
|
||||||
) -> Option<Substitution> {
|
) -> Option<Substitution> {
|
||||||
// we create a var for each type parameter of the impl; we need to keep in
|
// we create a var for each type parameter of the impl; we need to keep in
|
||||||
// mind here that `self_ty` might have vars of its own
|
// mind here that `self_ty` might have vars of its own
|
||||||
let vars = Substitution::build_for_def(db, impl_id)
|
let vars = TyBuilder::subst_for_def(db, impl_id)
|
||||||
.fill_with_bound_vars(DebruijnIndex::INNERMOST, self_ty.binders.len(&Interner))
|
.fill_with_bound_vars(DebruijnIndex::INNERMOST, self_ty.binders.len(&Interner))
|
||||||
.build();
|
.build();
|
||||||
let self_ty_with_vars = db.impl_self_ty(impl_id).subst(&vars);
|
let self_ty_with_vars = db.impl_self_ty(impl_id).subst(&vars);
|
||||||
|
@ -760,13 +760,13 @@ fn transform_receiver_ty(
|
||||||
self_ty: &Canonical<Ty>,
|
self_ty: &Canonical<Ty>,
|
||||||
) -> Option<Ty> {
|
) -> Option<Ty> {
|
||||||
let substs = match function_id.lookup(db.upcast()).container {
|
let substs = match function_id.lookup(db.upcast()).container {
|
||||||
AssocContainerId::TraitId(_) => Substitution::build_for_def(db, function_id)
|
AssocContainerId::TraitId(_) => TyBuilder::subst_for_def(db, function_id)
|
||||||
.push(self_ty.value.clone())
|
.push(self_ty.value.clone())
|
||||||
.fill_with_unknown()
|
.fill_with_unknown()
|
||||||
.build(),
|
.build(),
|
||||||
AssocContainerId::ImplId(impl_id) => {
|
AssocContainerId::ImplId(impl_id) => {
|
||||||
let impl_substs = inherent_impl_substs(db, impl_id, &self_ty)?;
|
let impl_substs = inherent_impl_substs(db, impl_id, &self_ty)?;
|
||||||
Substitution::build_for_def(db, function_id)
|
TyBuilder::subst_for_def(db, function_id)
|
||||||
.use_parent_substs(&impl_substs)
|
.use_parent_substs(&impl_substs)
|
||||||
.fill_with_unknown()
|
.fill_with_unknown()
|
||||||
.build()
|
.build()
|
||||||
|
|
Loading…
Reference in a new issue