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.rs22
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(