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.rs14
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));