Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/path.rs')
| -rw-r--r-- | crates/hir-ty/src/infer/path.rs | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs index 7e9cf9f767..461cea4f14 100644 --- a/crates/hir-ty/src/infer/path.rs +++ b/crates/hir-ty/src/infer/path.rs @@ -105,11 +105,9 @@ impl InferenceContext<'_> { let substs = substs.as_slice(Interner); if let ValueNs::EnumVariantId(_) = value { - let mut it = self_subst - .as_ref() - .map_or(&[][..], |s| s.as_slice(Interner)) + let mut it = substs .iter() - .chain(substs) + .chain(self_subst.as_ref().map_or(&[][..], |s| s.as_slice(Interner))) .cloned(); let builder = TyBuilder::subst_for_def(self.db, generic_def, None); let substs = builder @@ -130,11 +128,11 @@ impl InferenceContext<'_> { let parent_substs = self_subst.or_else(|| { let generics = generics(self.db, generic_def); let parent_params_len = generics.parent_generics()?.len(); - let parent_args = &substs[substs.len() - parent_params_len..]; + let parent_args = &substs[..parent_params_len]; Some(Substitution::from_iter(Interner, parent_args)) }); let parent_substs_len = parent_substs.as_ref().map_or(0, |s| s.len(Interner)); - let mut it = substs.iter().take(substs.len() - parent_substs_len).cloned(); + let mut it = substs.iter().skip(parent_substs_len).cloned(); let builder = TyBuilder::subst_for_def(self.db, generic_def, parent_substs); let substs = builder .fill(|x| { @@ -261,9 +259,9 @@ impl InferenceContext<'_> { }; if let ItemContainerId::TraitId(trait_) = container { - let param_len = generics(self.db, def).len_self(); + let parent_len = generics(self.db, def).parent_generics().map_or(0, |g| g.len_self()); let parent_subst = - Substitution::from_iter(Interner, subst.iter(Interner).skip(param_len)); + Substitution::from_iter(Interner, subst.iter(Interner).take(parent_len)); let trait_ref = TraitRef { trait_id: to_chalk_trait_id(trait_), substitution: parent_subst }; self.push_obligation(trait_ref.cast(Interner)); |