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 | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs index 6cad84eb4f..dc645f840e 100644 --- a/crates/hir-ty/src/infer/path.rs +++ b/crates/hir-ty/src/infer/path.rs @@ -234,7 +234,8 @@ impl<'a> InferenceContext<'a> { let canonical_ty = self.canonicalize(ty.clone()); let traits_in_scope = self.resolver.traits_in_scope(self.db.upcast()); - method_resolution::iterate_method_candidates( + let mut not_visible = None; + let res = method_resolution::iterate_method_candidates( &canonical_ty.value, self.db, self.table.trait_env.clone(), @@ -242,7 +243,7 @@ impl<'a> InferenceContext<'a> { VisibleFromModule::Filter(self.resolver.module()), Some(name), method_resolution::LookupMode::Path, - move |_ty, item| { + |_ty, item, visible| { let (def, container) = match item { AssocItemId::FunctionId(f) => { (ValueNs::FunctionId(f), f.lookup(self.db.upcast()).container) @@ -277,10 +278,21 @@ impl<'a> InferenceContext<'a> { } }; - self.write_assoc_resolution(id, item, substs.clone()); - Some((def, Some(substs))) + if visible { + Some((def, item, Some(substs))) + } else { + if not_visible.is_none() { + not_visible = Some((def, item, Some(substs))); + } + None + } }, - ) + ); + let res = res.or(not_visible); + if let Some((_, item, Some(ref substs))) = res { + self.write_assoc_resolution(id, item, substs.clone()); + } + res.map(|(def, _, substs)| (def, substs)) } fn resolve_enum_variant_on_ty( |