Unnamed repository; edit this file 'description' to name the repository.
fix: len method of generics next solver to use `consider_late_bound`
dfireBird 4 weeks ago
parent 588c4e7 · commit 94e6b68
-rw-r--r--crates/hir-def/src/expr_store/lower.rs4
-rw-r--r--crates/hir-ty/src/generics.rs17
-rw-r--r--crates/hir-ty/src/lower/path.rs2
-rw-r--r--crates/hir-ty/src/next_solver/generics.rs2
-rw-r--r--crates/hir-ty/src/next_solver/interner.rs2
-rw-r--r--crates/hir-ty/src/traits.rs3
-rw-r--r--crates/hir-ty/src/variance.rs4
7 files changed, 20 insertions, 14 deletions
diff --git a/crates/hir-def/src/expr_store/lower.rs b/crates/hir-def/src/expr_store/lower.rs
index d70ef7ac19..f3cf2f7d81 100644
--- a/crates/hir-def/src/expr_store/lower.rs
+++ b/crates/hir-def/src/expr_store/lower.rs
@@ -3501,7 +3501,7 @@ impl ExprCollector<'_> {
#[salsa::tracked(returns(deref), cycle_result = get_constrained_lifetimes_cycle_result)]
fn get_constrained_lifetimes(
- db: &dyn DefDatabase,
+ db: &dyn SourceDatabase,
type_alias_id: TypeAliasId,
) -> Box<[u32]> {
let TypeAliasSignature { generic_params, store, ty, .. } =
@@ -3545,7 +3545,7 @@ impl ExprCollector<'_> {
}
fn get_constrained_lifetimes_cycle_result(
- _db: &dyn DefDatabase,
+ _db: &dyn SourceDatabase,
_: salsa::Id,
_id: TypeAliasId,
) -> Box<[u32]> {
diff --git a/crates/hir-ty/src/generics.rs b/crates/hir-ty/src/generics.rs
index 490900c85b..f2ca060bb5 100644
--- a/crates/hir-ty/src/generics.rs
+++ b/crates/hir-ty/src/generics.rs
@@ -72,8 +72,12 @@ impl<'db> SingleGenerics<'db> {
self.params.len_lifetimes()
}
- pub(crate) fn len(&self) -> usize {
- self.params.len()
+ pub(crate) fn len(&self, consider_late_bound: bool) -> usize {
+ if consider_late_bound {
+ self.params.len()
+ } else {
+ self.params.len() - self.params.len_late_bound_lifetimes()
+ }
}
fn iter_lifetimes(&self) -> impl Iterator<Item = (LifetimeParamId, &'db LifetimeParamData)> {
@@ -243,17 +247,18 @@ impl<'db> Generics<'db> {
}
/// Returns total number of generic parameters in scope, including those from parent.
- pub(crate) fn len(&self) -> usize {
+ pub(crate) fn len(&self, consider_late_bound: bool) -> usize {
match &*self.chain {
- [parent, owner] => parent.len() + owner.len(),
- [owner] => owner.len(),
+ [parent, owner] => parent.len(consider_late_bound) + owner.len(consider_late_bound),
+ [owner] => owner.len(consider_late_bound),
_ => unreachable!(),
}
}
#[inline]
pub(crate) fn len_parent(&self) -> usize {
- self.parent().map_or(0, SingleGenerics::len)
+ // add `consider_late_bound` arg if needed in future, currently it's not needed.
+ self.parent().map_or(0, |p| p.len(true))
}
pub(crate) fn len_lifetimes_self(&self) -> usize {
diff --git a/crates/hir-ty/src/lower/path.rs b/crates/hir-ty/src/lower/path.rs
index 49b45a40e6..27d52881c6 100644
--- a/crates/hir-ty/src/lower/path.rs
+++ b/crates/hir-ty/src/lower/path.rs
@@ -1191,7 +1191,7 @@ pub(crate) fn substs_from_args_and_bindings<'db>(
ctx,
);
- let mut substs = Vec::with_capacity(def_generics.len());
+ let mut substs = Vec::with_capacity(def_generics.len(true));
substs.extend(
def_generics.iter_parent_id().enumerate().map(|(idx, id)| ctx.parent_arg(idx as u32, id)),
diff --git a/crates/hir-ty/src/next_solver/generics.rs b/crates/hir-ty/src/next_solver/generics.rs
index de8f991ae8..49dbbcb06b 100644
--- a/crates/hir-ty/src/next_solver/generics.rs
+++ b/crates/hir-ty/src/next_solver/generics.rs
@@ -100,6 +100,6 @@ impl<'db> Generics<'db> {
impl<'db> rustc_type_ir::inherent::GenericsOf<DbInterner<'db>> for Generics<'db> {
fn count(&self) -> usize {
- self.generics.len() + usize::from(self.additional_param.is_some())
+ self.generics.len(self.consider_late_bound) + usize::from(self.additional_param.is_some())
}
}
diff --git a/crates/hir-ty/src/next_solver/interner.rs b/crates/hir-ty/src/next_solver/interner.rs
index 3c2976eccd..9d9e83fc1a 100644
--- a/crates/hir-ty/src/next_solver/interner.rs
+++ b/crates/hir-ty/src/next_solver/interner.rs
@@ -1145,7 +1145,7 @@ impl<'db> Interner for DbInterner<'db> {
) -> (rustc_type_ir::TraitRef<Self>, Self::GenericArgsSlice) {
let trait_def_id = self.projection_parent(def_id).0;
let trait_generics = crate::generics::generics(self.db, trait_def_id.into());
- let trait_generics_len = trait_generics.len();
+ let trait_generics_len = trait_generics.len(true);
let trait_args = GenericArgs::new_from_slice(&args.as_slice()[..trait_generics_len]);
let alias_args = &args.as_slice()[trait_generics_len..];
(TraitRef::new_from_args(self, trait_def_id.into(), trait_args), alias_args)
diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs
index 2ca9ebe070..935f541841 100644
--- a/crates/hir-ty/src/traits.rs
+++ b/crates/hir-ty/src/traits.rs
@@ -24,7 +24,7 @@ use rustc_type_ir::{
};
use crate::{
- LifetimeElisionKind, Span, TyLoweringContext,
+ LifetimeElisionKind, LifetimeLoweringMode, Span, TyLoweringContext,
db::HirDatabase,
generics::Generics,
lower::LoweringMode,
@@ -192,6 +192,7 @@ pub fn where_predicate_must_hold<'db>(
generic_def,
&generics,
LifetimeElisionKind::Infer,
+ LifetimeLoweringMode::Bound,
)
.with_interning_mode(LoweringMode::Ide);
let clauses =
diff --git a/crates/hir-ty/src/variance.rs b/crates/hir-ty/src/variance.rs
index 586608c8b5..9e04353087 100644
--- a/crates/hir-ty/src/variance.rs
+++ b/crates/hir-ty/src/variance.rs
@@ -58,7 +58,7 @@ fn variances_of_query(db: &dyn HirDatabase, def: GenericDefId) -> StoredVariance
}
let generics = generics(db, def);
- let count = generics.len();
+ let count = generics.len(true);
if count == 0 {
return VariancesOf::empty(DbInterner::new_no_crate(db)).store();
}
@@ -106,7 +106,7 @@ pub(crate) fn variances_of_cycle_initial(
) -> StoredVariancesOf {
let interner = DbInterner::new_no_crate(db);
let generics = generics(db, def);
- let count = generics.len();
+ let count = generics.len(true);
VariancesOf::new_from_iter(interner, std::iter::repeat_n(Variance::Bivariant, count)).store()
}