diff --git a/crates/ra_hir_def/src/find_path.rs b/crates/ra_hir_def/src/find_path.rs index 8cc2fb160d3..d9e67607f66 100644 --- a/crates/ra_hir_def/src/find_path.rs +++ b/crates/ra_hir_def/src/find_path.rs @@ -7,7 +7,7 @@ use crate::{ visibility::Visibility, CrateId, ModuleDefId, ModuleId, }; -use hir_expand::name::Name; +use hir_expand::name::{known, Name}; const MAX_PATH_LEN: usize = 15; @@ -102,7 +102,7 @@ fn find_path_inner( let mut best_path = None; let mut best_path_len = max_len; for (module_id, name) in importable_locations { - let mut path = match find_path_inner( + let mut new_path = match find_path_inner( db, ItemInNs::Types(ModuleDefId::ModuleId(module_id)), from, @@ -111,15 +111,40 @@ fn find_path_inner( None => continue, Some(path) => path, }; - path.segments.push(name); - if path_len(&path) < best_path_len { - best_path_len = path_len(&path); - best_path = Some(path); + new_path.segments.push(name); + + if prefer_new_path(best_path_len, best_path.as_ref(), &new_path) { + best_path_len = path_len(&new_path); + best_path = Some(new_path); } } best_path } +fn prefer_new_path(old_path_len: usize, old_path: Option<&ModPath>, new_path: &ModPath) -> bool { + match (old_path.and_then(|mod_path| mod_path.segments.first()), new_path.segments.first()) { + (Some(old_path_start), Some(new_path_start)) + if old_path_start == &known::std && use_std_instead(new_path_start) => + { + false + } + (Some(old_path_start), Some(new_path_start)) + if new_path_start == &known::std && use_std_instead(old_path_start) => + { + true + } + (None, Some(_)) => true, + (Some(_), None) => false, + _ => path_len(new_path) < old_path_len, + } +} + +// When std library is present, paths starting with `std::` +// should be preferred over paths starting with `core::` and `alloc::` +fn use_std_instead(name: &Name) -> bool { + name == &known::core || name == &known::alloc +} + fn path_len(path: &ModPath) -> usize { path.segments.len() + match path.kind { diff --git a/crates/ra_hir_expand/src/name.rs b/crates/ra_hir_expand/src/name.rs index b3fa1efbab5..b2e10f445f3 100644 --- a/crates/ra_hir_expand/src/name.rs +++ b/crates/ra_hir_expand/src/name.rs @@ -141,6 +141,8 @@ pub mod known { macro_rules, // Components of known path (value or mod name) std, + core, + alloc, iter, ops, future, diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json index d38a45b8594..96e9ac378ea 100644 --- a/editors/code/package-lock.json +++ b/editors/code/package-lock.json @@ -782,7 +782,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } }