Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/hir-def/src/expr_store/lower.rs | 4 | ||||
| -rw-r--r-- | crates/hir-ty/src/generics.rs | 17 | ||||
| -rw-r--r-- | crates/hir-ty/src/lower/path.rs | 2 | ||||
| -rw-r--r-- | crates/hir-ty/src/next_solver/generics.rs | 2 | ||||
| -rw-r--r-- | crates/hir-ty/src/next_solver/interner.rs | 2 | ||||
| -rw-r--r-- | crates/hir-ty/src/traits.rs | 3 | ||||
| -rw-r--r-- | crates/hir-ty/src/variance.rs | 4 |
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() } |