Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/generic_arg.rs')
-rw-r--r--crates/hir-ty/src/next_solver/generic_arg.rs45
1 files changed, 32 insertions, 13 deletions
diff --git a/crates/hir-ty/src/next_solver/generic_arg.rs b/crates/hir-ty/src/next_solver/generic_arg.rs
index 51f070cd64..4e5f3c8c49 100644
--- a/crates/hir-ty/src/next_solver/generic_arg.rs
+++ b/crates/hir-ty/src/next_solver/generic_arg.rs
@@ -9,7 +9,7 @@
use std::{hint::unreachable_unchecked, marker::PhantomData, ptr::NonNull};
use arrayvec::ArrayVec;
-use hir_def::{GenericDefId, GenericParamId};
+use hir_def::{GenericDefId, GenericParamId, hir::generics::LifetimeParamData};
use intern::InternedRef;
use rustc_type_ir::{
ClosureArgs, ConstVid, CoroutineArgs, CoroutineClosureArgs, FallibleTypeFolder,
@@ -518,10 +518,15 @@ impl<'db> GenericArgs<'db> {
defs: &Generics<'db>,
mut mk_kind: F,
) where
- F: FnMut(u32, GenericParamId, &[GenericArg<'db>]) -> GenericArg<'db>,
+ F: FnMut(
+ u32,
+ GenericParamId,
+ Option<&LifetimeParamData>,
+ &[GenericArg<'db>],
+ ) -> GenericArg<'db>,
{
- defs.iter_id().enumerate().for_each(|(idx, param_id)| {
- let new_arg = mk_kind(idx as u32, param_id, args.as_ref());
+ defs.iter().enumerate().for_each(|(idx, (param, lt_data))| {
+ let new_arg = mk_kind(idx as u32, param, lt_data, args.as_ref());
args.push(new_arg);
});
}
@@ -529,7 +534,12 @@ impl<'db> GenericArgs<'db> {
#[cold]
fn fill_vec_builder<F>(defs: &Generics<'db>, count: usize, mk_kind: F) -> GenericArgs<'db>
where
- F: FnMut(u32, GenericParamId, &[GenericArg<'db>]) -> GenericArg<'db>,
+ F: FnMut(
+ u32,
+ GenericParamId,
+ Option<&LifetimeParamData>,
+ &[GenericArg<'db>],
+ ) -> GenericArg<'db>,
{
let mut args = Vec::with_capacity(count);
Self::fill_builder(&mut args, defs, mk_kind);
@@ -547,7 +557,12 @@ impl<'db> GenericArgs<'db> {
mk_kind: F,
) -> GenericArgs<'db>
where
- F: FnMut(u32, GenericParamId, &[GenericArg<'db>]) -> GenericArg<'db>,
+ F: FnMut(
+ u32,
+ GenericParamId,
+ Option<&LifetimeParamData>,
+ &[GenericArg<'db>],
+ ) -> GenericArg<'db>,
{
let defs = interner.generics_of(def_id);
let count = defs.count();
@@ -565,7 +580,9 @@ impl<'db> GenericArgs<'db> {
/// Creates an all-error `GenericArgs`.
pub fn error_for_item(interner: DbInterner<'db>, def_id: SolverDefId) -> GenericArgs<'db> {
- GenericArgs::for_item(interner, def_id, |_, id, _| GenericArg::error_from_id(interner, id))
+ GenericArgs::for_item(interner, def_id, |_, id, _, _| {
+ GenericArg::error_from_id(interner, id)
+ })
}
/// Like `for_item`, but prefers the default of a parameter if it has any.
@@ -578,9 +595,11 @@ impl<'db> GenericArgs<'db> {
F: FnMut(u32, GenericParamId, &[GenericArg<'db>]) -> GenericArg<'db>,
{
let defaults = interner.db.generic_defaults(def_id);
- Self::for_item(interner, def_id.into(), |idx, id, prev| match defaults.get(idx as usize) {
- Some(default) => default.instantiate(interner, prev).skip_norm_wip(),
- None => fallback(idx, id, prev),
+ Self::for_item(interner, def_id.into(), |idx, id, _, prev| {
+ match defaults.get(idx as usize) {
+ Some(default) => default.instantiate(interner, prev).skip_norm_wip(),
+ None => fallback(idx, id, prev),
+ }
})
}
@@ -595,7 +614,7 @@ impl<'db> GenericArgs<'db> {
F: FnMut(u32, GenericParamId, &[GenericArg<'db>]) -> GenericArg<'db>,
{
let mut iter = first.into_iter();
- Self::for_item(interner, def_id, |idx, id, prev| {
+ Self::for_item(interner, def_id, |idx, id, _, prev| {
iter.next().unwrap_or_else(|| fallback(idx, id, prev))
})
}
@@ -676,7 +695,7 @@ impl<'db> rustc_type_ir::inherent::GenericArgs<DbInterner<'db>> for GenericArgs<
interner: DbInterner<'db>,
def_id: <DbInterner<'db> as rustc_type_ir::Interner>::DefId,
) -> <DbInterner<'db> as rustc_type_ir::Interner>::GenericArgs {
- Self::for_item(interner, def_id, |index, kind, _| mk_param(interner, index, kind))
+ Self::for_item(interner, def_id, |index, kind, _, _| mk_param(interner, index, kind))
}
fn extend_with_error(
@@ -684,7 +703,7 @@ impl<'db> rustc_type_ir::inherent::GenericArgs<DbInterner<'db>> for GenericArgs<
def_id: <DbInterner<'db> as rustc_type_ir::Interner>::DefId,
original_args: &[<DbInterner<'db> as rustc_type_ir::Interner>::GenericArg],
) -> <DbInterner<'db> as rustc_type_ir::Interner>::GenericArgs {
- Self::for_item(interner, def_id, |index, kind, _| {
+ Self::for_item(interner, def_id, |index, kind, _, _| {
if let Some(arg) = original_args.get(index as usize) {
*arg
} else {