Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/lib.rs')
| -rw-r--r-- | crates/hir/src/lib.rs | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index ce487510fd..37c213c2af 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -3774,24 +3774,25 @@ impl GenericSubstitution { TypeOrConstParamData::TypeParamData(param) => Some(param.name.clone()), TypeOrConstParamData::ConstParamData(_) => None, }); - // The `Substitution` is first self then container, we want the reverse order. - let subst_type_params = self.subst.type_parameters(Interner).collect::<Vec<_>>(); - let mut self_params = subst_type_params + let parent_len = self.subst.len(Interner) + - generics + .iter_type_or_consts() + .filter(|g| matches!(g.1, TypeOrConstParamData::TypeParamData(..))) + .count(); + let container_params = self.subst.as_slice(Interner)[..parent_len] .iter() - .zip(type_params) - .filter_map(|(ty, name)| { - Some((name?.symbol().clone(), Type { ty: ty.clone(), env: self.env.clone() })) - }) - .collect::<Vec<_>>(); - let mut container_params = subst_type_params[self_params.len()..] + .filter_map(|param| param.ty(Interner).cloned()) + .zip(container_type_params.into_iter().flatten()); + let self_params = self.subst.as_slice(Interner)[parent_len..] .iter() - .zip(container_type_params.into_iter().flatten()) + .filter_map(|param| param.ty(Interner).cloned()) + .zip(type_params); + container_params + .chain(self_params) .filter_map(|(ty, name)| { Some((name?.symbol().clone(), Type { ty: ty.clone(), env: self.env.clone() })) }) - .collect::<Vec<_>>(); - container_params.append(&mut self_params); - container_params + .collect() } } |