Skip to content

Commit a4d7bdf

Browse files
committed
Replace Substitution::bound_vars and ::type_params_for_generics
1 parent 715c178 commit a4d7bdf

File tree

7 files changed

+42
-54
lines changed

7 files changed

+42
-54
lines changed

crates/hir_ty/src/display.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::{
1919
db::HirDatabase, from_assoc_type_id, from_foreign_def_id, from_placeholder_idx, primitive,
2020
to_assoc_type_id, traits::chalk::from_chalk, utils::generics, AdtId, AliasEq, AliasTy,
2121
CallableDefId, CallableSig, DomainGoal, GenericArg, ImplTraitId, Interner, Lifetime, OpaqueTy,
22-
ProjectionTy, QuantifiedWhereClause, Scalar, Substitution, TraitRef, Ty, TyExt, TyKind,
22+
ProjectionTy, QuantifiedWhereClause, Scalar, TraitRef, Ty, TyExt, TyKind,
2323
WhereClause,
2424
};
2525

@@ -592,7 +592,7 @@ impl HirDisplay for Ty {
592592
write!(f, "{}", param_data.name.clone().unwrap_or_else(Name::missing))?
593593
}
594594
TypeParamProvenance::ArgumentImplTrait => {
595-
let substs = Substitution::type_params_for_generics(f.db, &generics);
595+
let substs = generics.type_params_subst(f.db);
596596
let bounds = f
597597
.db
598598
.generic_predicates(id.parent)

crates/hir_ty/src/infer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use syntax::SmolStr;
3838

3939
use super::{
4040
traits::{DomainGoal, Guidance, Solution},
41-
InEnvironment, ProjectionTy, Substitution, TraitEnvironment, TraitRef, Ty, TypeWalk,
41+
InEnvironment, ProjectionTy, TraitEnvironment, TraitRef, Ty, TypeWalk,
4242
};
4343
use crate::{
4444
db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode,
@@ -487,7 +487,7 @@ impl<'a> InferenceContext<'a> {
487487
}
488488
TypeNs::SelfType(impl_id) => {
489489
let generics = crate::utils::generics(self.db.upcast(), impl_id.into());
490-
let substs = Substitution::type_params_for_generics(self.db, &generics);
490+
let substs = generics.type_params_subst(self.db);
491491
let ty = self.db.impl_self_ty(impl_id).subst(&substs);
492492
match unresolved {
493493
None => {

crates/hir_ty/src/infer/path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl<'a> InferenceContext<'a> {
8080
}
8181
ValueNs::ImplSelf(impl_id) => {
8282
let generics = crate::utils::generics(self.db.upcast(), impl_id.into());
83-
let substs = Substitution::type_params_for_generics(self.db, &generics);
83+
let substs = generics.type_params_subst(self.db);
8484
let ty = self.db.impl_self_ty(impl_id).subst(&substs);
8585
if let Some((AdtId::StructId(struct_id), substs)) = ty.as_adt() {
8686
let ty = self.db.value_ty(struct_id.into()).subst(&substs);

crates/hir_ty/src/lib.rs

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use hir_def::{
4141
use crate::{
4242
db::HirDatabase,
4343
display::HirDisplay,
44-
utils::{generics, make_mut_slice, Generics},
44+
utils::{generics, make_mut_slice},
4545
};
4646

4747
pub use autoderef::autoderef;
@@ -463,34 +463,10 @@ impl Substitution {
463463
Substitution(elements.into_iter().casted(interner).collect())
464464
}
465465

466-
/// Return Substs that replace each parameter by itself (i.e. `Ty::Param`).
467-
pub(crate) fn type_params_for_generics(
468-
db: &dyn HirDatabase,
469-
generic_params: &Generics,
470-
) -> Substitution {
471-
Substitution::from_iter(
472-
&Interner,
473-
generic_params
474-
.iter()
475-
.map(|(id, _)| TyKind::Placeholder(to_placeholder_idx(db, id)).intern(&Interner)),
476-
)
477-
}
478-
479466
/// Return Substs that replace each parameter by itself (i.e. `Ty::Param`).
480467
pub fn type_params(db: &dyn HirDatabase, def: impl Into<GenericDefId>) -> Substitution {
481468
let params = generics(db.upcast(), def.into());
482-
Substitution::type_params_for_generics(db, &params)
483-
}
484-
485-
/// Return Substs that replace each parameter by a bound variable.
486-
pub(crate) fn bound_vars(generic_params: &Generics, debruijn: DebruijnIndex) -> Substitution {
487-
Substitution::from_iter(
488-
&Interner,
489-
generic_params
490-
.iter()
491-
.enumerate()
492-
.map(|(idx, _)| TyKind::BoundVar(BoundVar::new(debruijn, idx)).intern(&Interner)),
493-
)
469+
params.type_params_subst(db)
494470
}
495471
}
496472

crates/hir_ty/src/lower.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ impl<'a> TyLoweringContext<'a> {
234234
let impl_trait_id = ImplTraitId::ReturnTypeImplTrait(func, idx);
235235
let opaque_ty_id = self.db.intern_impl_trait_id(impl_trait_id).into();
236236
let generics = generics(self.db.upcast(), func.into());
237-
let parameters = Substitution::bound_vars(&generics, self.in_binders);
237+
let parameters = generics.bound_vars_subst(self.in_binders);
238238
TyKind::Alias(AliasTy::Opaque(OpaqueTy {
239239
opaque_ty_id,
240240
substitution: parameters,
@@ -411,24 +411,16 @@ impl<'a> TyLoweringContext<'a> {
411411
TypeNs::SelfType(impl_id) => {
412412
let generics = generics(self.db.upcast(), impl_id.into());
413413
let substs = match self.type_param_mode {
414-
TypeParamLoweringMode::Placeholder => {
415-
Substitution::type_params_for_generics(self.db, &generics)
416-
}
417-
TypeParamLoweringMode::Variable => {
418-
Substitution::bound_vars(&generics, self.in_binders)
419-
}
414+
TypeParamLoweringMode::Placeholder => generics.type_params_subst(self.db),
415+
TypeParamLoweringMode::Variable => generics.bound_vars_subst(self.in_binders),
420416
};
421417
self.db.impl_self_ty(impl_id).subst(&substs)
422418
}
423419
TypeNs::AdtSelfType(adt) => {
424420
let generics = generics(self.db.upcast(), adt.into());
425421
let substs = match self.type_param_mode {
426-
TypeParamLoweringMode::Placeholder => {
427-
Substitution::type_params_for_generics(self.db, &generics)
428-
}
429-
TypeParamLoweringMode::Variable => {
430-
Substitution::bound_vars(&generics, self.in_binders)
431-
}
422+
TypeParamLoweringMode::Placeholder => generics.type_params_subst(self.db),
423+
TypeParamLoweringMode::Variable => generics.bound_vars_subst(self.in_binders),
432424
};
433425
self.db.ty(adt.into()).subst(&substs)
434426
}
@@ -1060,7 +1052,7 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
10601052
/// function body.
10611053
fn type_for_fn(db: &dyn HirDatabase, def: FunctionId) -> Binders<Ty> {
10621054
let generics = generics(db.upcast(), def.into());
1063-
let substs = Substitution::bound_vars(&generics, DebruijnIndex::INNERMOST);
1055+
let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST);
10641056
Binders::new(
10651057
substs.len(&Interner),
10661058
TyKind::FnDef(CallableDefId::FunctionId(def).to_chalk(db), substs).intern(&Interner),
@@ -1105,7 +1097,7 @@ fn type_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> Binders<T
11051097
return type_for_adt(db, def.into());
11061098
}
11071099
let generics = generics(db.upcast(), def.into());
1108-
let substs = Substitution::bound_vars(&generics, DebruijnIndex::INNERMOST);
1100+
let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST);
11091101
Binders::new(
11101102
substs.len(&Interner),
11111103
TyKind::FnDef(CallableDefId::StructId(def).to_chalk(db), substs).intern(&Interner),
@@ -1132,7 +1124,7 @@ fn type_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -
11321124
return type_for_adt(db, def.parent.into());
11331125
}
11341126
let generics = generics(db.upcast(), def.parent.into());
1135-
let substs = Substitution::bound_vars(&generics, DebruijnIndex::INNERMOST);
1127+
let substs = generics.bound_vars_subst(DebruijnIndex::INNERMOST);
11361128
Binders::new(
11371129
substs.len(&Interner),
11381130
TyKind::FnDef(CallableDefId::EnumVariantId(def).to_chalk(db), substs).intern(&Interner),

crates/hir_ty/src/traits/chalk.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ pub(crate) fn associated_ty_data_query(
387387
// Lower bounds -- we could/should maybe move this to a separate query in `lower`
388388
let type_alias_data = db.type_alias_data(type_alias);
389389
let generic_params = generics(db.upcast(), type_alias.into());
390-
let bound_vars = Substitution::bound_vars(&generic_params, DebruijnIndex::INNERMOST);
390+
let bound_vars = generic_params.bound_vars_subst(DebruijnIndex::INNERMOST);
391391
let resolver = hir_def::resolver::HasResolver::resolver(type_alias, db.upcast());
392392
let ctx = crate::TyLoweringContext::new(db, &resolver)
393393
.with_type_param_mode(crate::lower::TypeParamLoweringMode::Variable);
@@ -421,7 +421,7 @@ pub(crate) fn trait_datum_query(
421421
let trait_data = db.trait_data(trait_);
422422
debug!("trait {:?} = {:?}", trait_id, trait_data.name);
423423
let generic_params = generics(db.upcast(), trait_.into());
424-
let bound_vars = Substitution::bound_vars(&generic_params, DebruijnIndex::INNERMOST);
424+
let bound_vars = generic_params.bound_vars_subst(DebruijnIndex::INNERMOST);
425425
let flags = rust_ir::TraitFlags {
426426
auto: trait_data.is_auto,
427427
upstream: trait_.lookup(db.upcast()).container.krate() != krate,
@@ -490,7 +490,7 @@ pub(crate) fn struct_datum_query(
490490
let upstream = adt_id.module(db.upcast()).krate() != krate;
491491
let where_clauses = {
492492
let generic_params = generics(db.upcast(), adt_id.into());
493-
let bound_vars = Substitution::bound_vars(&generic_params, DebruijnIndex::INNERMOST);
493+
let bound_vars = generic_params.bound_vars_subst(DebruijnIndex::INNERMOST);
494494
convert_where_clauses(db, adt_id.into(), &bound_vars)
495495
};
496496
let flags = rust_ir::AdtFlags {
@@ -539,7 +539,7 @@ fn impl_def_datum(
539539
let impl_data = db.impl_data(impl_id);
540540

541541
let generic_params = generics(db.upcast(), impl_id.into());
542-
let bound_vars = Substitution::bound_vars(&generic_params, DebruijnIndex::INNERMOST);
542+
let bound_vars = generic_params.bound_vars_subst(DebruijnIndex::INNERMOST);
543543
let trait_ = trait_ref.hir_trait_id();
544544
let impl_type = if impl_id.lookup(db.upcast()).container.krate() == krate {
545545
rust_ir::ImplType::Local
@@ -629,7 +629,7 @@ pub(crate) fn fn_def_datum_query(
629629
let callable_def: CallableDefId = from_chalk(db, fn_def_id);
630630
let generic_params = generics(db.upcast(), callable_def.into());
631631
let sig = db.callable_item_signature(callable_def);
632-
let bound_vars = Substitution::bound_vars(&generic_params, DebruijnIndex::INNERMOST);
632+
let bound_vars = generic_params.bound_vars_subst(DebruijnIndex::INNERMOST);
633633
let where_clauses = convert_where_clauses(db, callable_def.into(), &bound_vars);
634634
let bound = rust_ir::FnDefDatumBound {
635635
// Note: Chalk doesn't actually use this information yet as far as I am aware, but we provide it anyway

crates/hir_ty/src/utils.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//! query, but can't be computed directly from `*Data` (ie, which need a `db`).
33
use std::sync::Arc;
44

5-
use chalk_ir::DebruijnIndex;
5+
use chalk_ir::{BoundVar, DebruijnIndex};
66
use hir_def::{
77
adt::VariantData,
88
db::DefDatabase,
@@ -16,7 +16,7 @@ use hir_def::{
1616
};
1717
use hir_expand::name::{name, Name};
1818

19-
use crate::{db::HirDatabase, TraitRef, TypeWalk, WhereClause};
19+
use crate::{db::HirDatabase, Interner, Substitution, TraitRef, TyKind, TypeWalk, WhereClause};
2020

2121
fn direct_super_traits(db: &dyn DefDatabase, trait_: TraitId) -> Vec<TraitId> {
2222
let resolver = trait_.resolver(db);
@@ -249,6 +249,26 @@ impl Generics {
249249
self.parent_generics.as_ref().and_then(|g| g.find_param(param))
250250
}
251251
}
252+
253+
/// Returns a Substitution that replaces each parameter by a bound variable.
254+
pub(crate) fn bound_vars_subst(&self, debruijn: DebruijnIndex) -> Substitution {
255+
Substitution::from_iter(
256+
&Interner,
257+
self.iter()
258+
.enumerate()
259+
.map(|(idx, _)| TyKind::BoundVar(BoundVar::new(debruijn, idx)).intern(&Interner)),
260+
)
261+
}
262+
263+
/// Returns a Substitution that replaces each parameter by itself (i.e. `Ty::Param`).
264+
pub(crate) fn type_params_subst(&self, db: &dyn HirDatabase) -> Substitution {
265+
Substitution::from_iter(
266+
&Interner,
267+
self.iter().map(|(id, _)| {
268+
TyKind::Placeholder(crate::to_placeholder_idx(db, id)).intern(&Interner)
269+
}),
270+
)
271+
}
252272
}
253273

254274
fn parent_generic_def(db: &dyn DefDatabase, def: GenericDefId) -> Option<GenericDefId> {

0 commit comments

Comments
 (0)