Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/find_path.rs')
-rw-r--r--crates/hir-def/src/find_path.rs50
1 files changed, 20 insertions, 30 deletions
diff --git a/crates/hir-def/src/find_path.rs b/crates/hir-def/src/find_path.rs
index d386601d57..b64a62e8fa 100644
--- a/crates/hir-def/src/find_path.rs
+++ b/crates/hir-def/src/find_path.rs
@@ -312,19 +312,27 @@ fn calculate_best_path(
if max_len <= 1 {
return None;
}
+
let mut best_path = None;
- let update_best_path =
- |best_path: &mut Option<_>, new_path: (ModPath, Stability)| match best_path {
+ let mut best_path_len = max_len;
+ let mut process = |mut path: (ModPath, Stability), name, best_path_len: &mut _| {
+ path.0.push_segment(name);
+ let new_path = match best_path.take() {
+ Some(best_path) => select_best_path(best_path, path, ctx.cfg),
+ None => path,
+ };
+ if new_path.1 == Stable {
+ *best_path_len = new_path.0.len();
+ }
+ match &mut best_path {
Some((old_path, old_stability)) => {
*old_path = new_path.0;
*old_stability = zip_stability(*old_stability, new_path.1);
}
- None => *best_path = Some(new_path),
- };
-
+ None => best_path = Some(new_path),
+ }
+ };
let db = ctx.db;
-
- let mut best_path_len = max_len;
if item.krate(db) == Some(ctx.from.krate) {
// Item was defined in the same crate that wants to import it. It cannot be found in any
// dependency in this case.
@@ -335,19 +343,10 @@ fn calculate_best_path(
}
// we are looking for paths of length up to best_path_len, any longer will make it be
// less optimal. The -1 is due to us pushing name onto it afterwards.
- if let Some(mut path) =
+ if let Some(path) =
find_path_for_module(ctx, def_map, visited_modules, module_id, best_path_len - 1)
{
- path.0.push_segment(name);
-
- let new_path = match best_path.take() {
- Some(best_path) => select_best_path(best_path, path, ctx.cfg),
- None => path,
- };
- if new_path.1 == Stable {
- best_path_len = new_path.0.len();
- }
- update_best_path(&mut best_path, new_path);
+ process(path, name, &mut best_path_len);
}
}
} else {
@@ -373,25 +372,16 @@ fn calculate_best_path(
info.container,
best_path_len - 1,
);
- let Some((mut path, path_stability)) = path else {
+ let Some((path, path_stability)) = path else {
continue;
};
cov_mark::hit!(partially_imported);
- path.push_segment(info.name.clone());
-
- let path_with_stab = (
+ let path = (
path,
zip_stability(path_stability, if info.is_unstable { Unstable } else { Stable }),
);
- let new_path = match best_path.take() {
- Some(best_path) => select_best_path(best_path, path_with_stab, ctx.cfg),
- None => path_with_stab,
- };
- if new_path.1 == Stable {
- best_path_len = new_path.0.len();
- }
- update_best_path(&mut best_path, new_path);
+ process(path, info.name.clone(), &mut best_path_len);
}
}
}