Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #17277 - Veykril:find-path-fixes, r=Veykril
fix: Various find path fixes Fixes https://github.com/rust-lang/rust-analyzer/issues/17271
bors 2024-05-23
parent 42a8500 · parent 760ad44 · commit 6a16749
-rw-r--r--crates/hir-def/src/find_path.rs834
-rw-r--r--crates/hir-def/src/import_map.rs8
-rw-r--r--crates/hir-def/src/item_scope.rs2
-rw-r--r--crates/hir-def/src/lib.rs23
-rw-r--r--crates/hir-def/src/nameres.rs9
-rw-r--r--crates/hir-def/src/resolver.rs12
-rw-r--r--crates/hir-ty/src/display.rs4
-rw-r--r--crates/hir/src/lib.rs9
-rw-r--r--crates/hir/src/term_search/expr.rs23
-rw-r--r--crates/ide-assists/src/handlers/add_missing_match_arms.rs2
-rw-r--r--crates/ide-assists/src/handlers/bool_to_enum.rs6
-rw-r--r--crates/ide-assists/src/handlers/convert_into_to_from.rs2
-rw-r--r--crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs4
-rw-r--r--crates/ide-assists/src/handlers/destructure_struct_binding.rs2
-rw-r--r--crates/ide-assists/src/handlers/extract_function.rs2
-rw-r--r--crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs4
-rw-r--r--crates/ide-assists/src/handlers/generate_deref.rs4
-rw-r--r--crates/ide-assists/src/handlers/generate_new.rs2
-rw-r--r--crates/ide-assists/src/handlers/qualify_method_call.rs2
-rw-r--r--crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs2
-rw-r--r--crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs2
-rw-r--r--crates/ide-completion/src/completions.rs2
-rw-r--r--crates/ide-completion/src/completions/expr.rs4
-rw-r--r--crates/ide-completion/src/completions/postfix.rs2
-rw-r--r--crates/ide-completion/src/lib.rs2
-rw-r--r--crates/ide-completion/src/render.rs2
-rw-r--r--crates/ide-completion/src/snippet.rs2
-rw-r--r--crates/ide-db/src/imports/import_assets.rs4
-rw-r--r--crates/ide-db/src/path_transform.rs6
-rw-r--r--crates/ide-diagnostics/src/handlers/json_is_not_rust.rs4
-rw-r--r--crates/ide-diagnostics/src/handlers/missing_fields.rs2
-rw-r--r--crates/ide-diagnostics/src/handlers/typed_hole.rs3
-rw-r--r--crates/ide-ssr/src/matching.rs2
33 files changed, 647 insertions, 346 deletions
diff --git a/crates/hir-def/src/find_path.rs b/crates/hir-def/src/find_path.rs
index 4e57845a69..52d940d635 100644
--- a/crates/hir-def/src/find_path.rs
+++ b/crates/hir-def/src/find_path.rs
@@ -1,6 +1,9 @@
//! An algorithm to find a path to refer to a certain item.
-use std::{cmp::Ordering, iter};
+use std::{
+ cmp::Ordering,
+ iter::{self, once},
+};
use hir_expand::{
name::{known, AsName, Name},
@@ -14,7 +17,7 @@ use crate::{
nameres::DefMap,
path::{ModPath, PathKind},
visibility::{Visibility, VisibilityExplicitness},
- CrateRootModuleId, ModuleDefId, ModuleId,
+ ModuleDefId, ModuleId,
};
/// Find a path that can be used to refer to a certain item. This can depend on
@@ -23,26 +26,20 @@ pub fn find_path(
db: &dyn DefDatabase,
item: ItemInNs,
from: ModuleId,
- prefer_no_std: bool,
- prefer_prelude: bool,
-) -> Option<ModPath> {
- let _p = tracing::span!(tracing::Level::INFO, "find_path").entered();
- find_path_inner(FindPathCtx { db, prefixed: None, prefer_no_std, prefer_prelude }, item, from)
-}
-
-/// Find a path that can be used to refer to a certain item. This can depend on
-/// *from where* you're referring to the item, hence the `from` parameter.
-pub fn find_path_prefixed(
- db: &dyn DefDatabase,
- item: ItemInNs,
- from: ModuleId,
prefix_kind: PrefixKind,
+ ignore_local_imports: bool,
prefer_no_std: bool,
prefer_prelude: bool,
) -> Option<ModPath> {
- let _p = tracing::span!(tracing::Level::INFO, "find_path_prefixed").entered();
+ let _p = tracing::span!(tracing::Level::INFO, "find_path").entered();
find_path_inner(
- FindPathCtx { db, prefixed: Some(prefix_kind), prefer_no_std, prefer_prelude },
+ FindPathCtx {
+ db,
+ prefix: prefix_kind,
+ prefer_no_std,
+ prefer_prelude,
+ ignore_local_imports,
+ },
item,
from,
)
@@ -70,7 +67,7 @@ pub enum PrefixKind {
/// This is the same as plain, just that paths will start with `self` prepended if the path
/// starts with an identifier that is not a crate.
BySelf,
- /// Causes paths to ignore imports in the local module.
+ /// Causes paths to not use a self, super or crate prefix.
Plain,
/// Causes paths to start with `crate` where applicable, effectively forcing paths to be absolute.
ByCrate,
@@ -78,37 +75,33 @@ pub enum PrefixKind {
impl PrefixKind {
#[inline]
- fn prefix(self) -> PathKind {
+ fn path_kind(self) -> PathKind {
match self {
PrefixKind::BySelf => PathKind::Super(0),
PrefixKind::Plain => PathKind::Plain,
PrefixKind::ByCrate => PathKind::Crate,
}
}
-
- #[inline]
- fn is_absolute(&self) -> bool {
- self == &PrefixKind::ByCrate
- }
}
#[derive(Copy, Clone)]
struct FindPathCtx<'db> {
db: &'db dyn DefDatabase,
- prefixed: Option<PrefixKind>,
+ prefix: PrefixKind,
prefer_no_std: bool,
prefer_prelude: bool,
+ ignore_local_imports: bool,
}
/// Attempts to find a path to refer to the given `item` visible from the `from` ModuleId
fn find_path_inner(ctx: FindPathCtx<'_>, item: ItemInNs, from: ModuleId) -> Option<ModPath> {
// - if the item is a builtin, it's in scope
if let ItemInNs::Types(ModuleDefId::BuiltinType(builtin)) = item {
- return Some(ModPath::from_segments(PathKind::Plain, Some(builtin.as_name())));
+ return Some(ModPath::from_segments(PathKind::Plain, once(builtin.as_name())));
}
let def_map = from.def_map(ctx.db);
- let crate_root = def_map.crate_root();
+ let crate_root = from.derive_crate_root();
// - if the item is a module, jump straight to module search
if let ItemInNs::Types(ModuleDefId::ModuleId(module_id)) = item {
let mut visited_modules = FxHashSet::default();
@@ -119,7 +112,6 @@ fn find_path_inner(ctx: FindPathCtx<'_>, item: ItemInNs, from: ModuleId) -> Opti
},
&def_map,
&mut visited_modules,
- crate_root,
from,
module_id,
MAX_PATH_LEN,
@@ -127,11 +119,20 @@ fn find_path_inner(ctx: FindPathCtx<'_>, item: ItemInNs, from: ModuleId) -> Opti
.map(|(item, _)| item);
}
- // - if the item is already in scope, return the name under which it is
- let scope_name = find_in_scope(ctx.db, &def_map, from, item);
- if ctx.prefixed.is_none() {
+ let prefix = if item.module(ctx.db).is_some_and(|it| it.is_within_block()) {
+ PrefixKind::Plain
+ } else {
+ ctx.prefix
+ };
+ let may_be_in_scope = match prefix {
+ PrefixKind::Plain | PrefixKind::BySelf => true,
+ PrefixKind::ByCrate => from.is_crate_root(),
+ };
+ if may_be_in_scope {
+ // - if the item is already in scope, return the name under which it is
+ let scope_name = find_in_scope(ctx.db, &def_map, from, item, ctx.ignore_local_imports);
if let Some(scope_name) = scope_name {
- return Some(ModPath::from_segments(PathKind::Plain, Some(scope_name)));
+ return Some(ModPath::from_segments(prefix.path_kind(), Some(scope_name)));
}
}
@@ -164,11 +165,9 @@ fn find_path_inner(ctx: FindPathCtx<'_>, item: ItemInNs, from: ModuleId) -> Opti
},
&def_map,
&mut visited_modules,
- crate_root,
MAX_PATH_LEN,
item,
from,
- scope_name,
)
.map(|(item, _)| item)
}
@@ -178,7 +177,6 @@ fn find_path_for_module(
ctx: FindPathCtx<'_>,
def_map: &DefMap,
visited_modules: &mut FxHashSet<ModuleId>,
- crate_root: CrateRootModuleId,
from: ModuleId,
module_id: ModuleId,
max_len: usize,
@@ -187,38 +185,25 @@ fn find_path_for_module(
return None;
}
- // Base cases:
- // - if the item is already in scope, return the name under which it is
- let scope_name = find_in_scope(ctx.db, def_map, from, ItemInNs::Types(module_id.into()));
- if ctx.prefixed.is_none() {
- if let Some(scope_name) = scope_name {
- return Some((ModPath::from_segments(PathKind::Plain, Some(scope_name)), Stable));
- }
- }
-
+ let is_crate_root = module_id.as_crate_root();
// - if the item is the crate root, return `crate`
- if module_id == crate_root {
+ if is_crate_root.is_some_and(|it| it == from.derive_crate_root()) {
return Some((ModPath::from_segments(PathKind::Crate, None), Stable));
}
- // - if relative paths are fine, check if we are searching for a parent
- if ctx.prefixed.filter(PrefixKind::is_absolute).is_none() {
- if let modpath @ Some(_) = find_self_super(def_map, module_id, from) {
- return modpath.zip(Some(Stable));
- }
- }
-
+ let root_def_map = from.derive_crate_root().def_map(ctx.db);
// - if the item is the crate root of a dependency crate, return the name from the extern prelude
- let root_def_map = crate_root.def_map(ctx.db);
- for (name, (def_id, _extern_crate)) in root_def_map.extern_prelude() {
- if module_id == def_id {
- let name = scope_name.unwrap_or_else(|| name.clone());
-
+ if let Some(crate_root) = is_crate_root {
+ // rev here so we prefer looking at renamed extern decls first
+ for (name, (def_id, _extern_crate)) in root_def_map.extern_prelude().rev() {
+ if crate_root != def_id {
+ continue;
+ }
let name_already_occupied_in_type_ns = def_map
.with_ancestor_maps(ctx.db, from.local_id, &mut |def_map, local_id| {
def_map[local_id]
.scope
- .type_(&name)
+ .type_(name)
.filter(|&(id, _)| id != ModuleDefId::ModuleId(def_id.into()))
})
.is_some();
@@ -228,24 +213,48 @@ fn find_path_for_module(
} else {
PathKind::Plain
};
- return Some((ModPath::from_segments(kind, Some(name)), Stable));
+ return Some((ModPath::from_segments(kind, once(name.clone())), Stable));
+ }
+ }
+ let prefix = if module_id.is_within_block() { PrefixKind::Plain } else { ctx.prefix };
+ let may_be_in_scope = match prefix {
+ PrefixKind::Plain | PrefixKind::BySelf => true,
+ PrefixKind::ByCrate => from.is_crate_root(),
+ };
+ if may_be_in_scope {
+ let scope_name = find_in_scope(
+ ctx.db,
+ def_map,
+ from,
+ ItemInNs::Types(module_id.into()),
+ ctx.ignore_local_imports,
+ );
+ if let Some(scope_name) = scope_name {
+ // - if the item is already in scope, return the name under which it is
+ return Some((ModPath::from_segments(prefix.path_kind(), once(scope_name)), Stable));
}
}
- if let value @ Some(_) =
+ // - if the module can be referenced as self, super or crate, do that
+ if let Some(mod_path) = is_kw_kind_relative_to_from(def_map, module_id, from) {
+ if ctx.prefix != PrefixKind::ByCrate || mod_path.kind == PathKind::Crate {
+ return Some((mod_path, Stable));
+ }
+ }
+
+ // - if the module is in the prelude, return it by that path
+ if let Some(mod_path) =
find_in_prelude(ctx.db, &root_def_map, def_map, ItemInNs::Types(module_id.into()), from)
{
- return value.zip(Some(Stable));
+ return Some((mod_path, Stable));
}
calculate_best_path(
ctx,
def_map,
visited_modules,
- crate_root,
max_len,
ItemInNs::Types(module_id.into()),
from,
- scope_name,
)
}
@@ -255,9 +264,13 @@ fn find_in_scope(
def_map: &DefMap,
from: ModuleId,
item: ItemInNs,
+ ignore_local_imports: bool,
) -> Option<Name> {
+ // FIXME: We could have multiple applicable names here, but we currently only return the first
def_map.with_ancestor_maps(db, from.local_id, &mut |def_map, local_id| {
- def_map[local_id].scope.names_of(item, |name, _, _| Some(name.clone()))
+ def_map[local_id].scope.names_of(item, |name, _, declared| {
+ (declared || !ignore_local_imports).then(|| name.clone())
+ })
})
}
@@ -292,21 +305,32 @@ fn find_in_prelude(
});
if found_and_same_def.unwrap_or(true) {
- Some(ModPath::from_segments(PathKind::Plain, Some(name.clone())))
+ Some(ModPath::from_segments(PathKind::Plain, once(name.clone())))
} else {
None
}
}
-fn find_self_super(def_map: &DefMap, item: ModuleId, from: ModuleId) -> Option<ModPath> {
+fn is_kw_kind_relative_to_from(
+ def_map: &DefMap,
+ item: ModuleId,
+ from: ModuleId,
+) -> Option<ModPath> {
+ if item.krate != from.krate || item.is_within_block() || from.is_within_block() {
+ return None;
+ }
+ let item = item.local_id;
+ let from = from.local_id;
if item == from {
// - if the item is the module we're in, use `self`
Some(ModPath::from_segments(PathKind::Super(0), None))
- } else if let Some(parent_id) = def_map[from.local_id].parent {
- // - if the item is the parent module, use `super` (this is not used recursively, since `super::super` is ugly)
- let parent_id = def_map.module_id(parent_id);
+ } else if let Some(parent_id) = def_map[from].parent {
if item == parent_id {
- Some(ModPath::from_segments(PathKind::Super(1), None))
+ // - if the item is the parent module, use `super` (this is not used recursively, since `super::super` is ugly)
+ Some(ModPath::from_segments(
+ if parent_id == DefMap::ROOT { PathKind::Crate } else { PathKind::Super(1) },
+ None,
+ ))
} else {
None
}
@@ -320,11 +344,9 @@ fn calculate_best_path(
ctx: FindPathCtx<'_>,
def_map: &DefMap,
visited_modules: &mut FxHashSet<ModuleId>,
- crate_root: CrateRootModuleId,
max_len: usize,
item: ItemInNs,
from: ModuleId,
- scope_name: Option<Name>,
) -> Option<(ModPath, Stability)> {
if max_len <= 1 {
return None;
@@ -346,14 +368,12 @@ fn calculate_best_path(
// dependency in this case.
for (module_id, name) in find_local_import_locations(ctx.db, item, from) {
if !visited_modules.insert(module_id) {
- cov_mark::hit!(recursive_imports);
continue;
}
if let Some(mut path) = find_path_for_module(
ctx,
def_map,
visited_modules,
- crate_root,
from,
module_id,
best_path_len - 1,
@@ -390,7 +410,6 @@ fn calculate_best_path(
ctx,
def_map,
visited_modules,
- crate_root,
from,
info.container,
max_len - 1,
@@ -418,19 +437,7 @@ fn calculate_best_path(
}
}
}
- let mut prefixed = ctx.prefixed;
- if let Some(module) = item.module(ctx.db) {
- if module.containing_block().is_some() && ctx.prefixed.is_some() {
- cov_mark::hit!(prefixed_in_block_expression);
- prefixed = Some(PrefixKind::Plain);
- }
- }
- match prefixed.map(PrefixKind::prefix) {
- Some(prefix) => best_path.or_else(|| {
- scope_name.map(|scope_name| (ModPath::from_segments(prefix, Some(scope_name)), Stable))
- }),
- None => best_path,
- }
+ best_path
}
/// Select the best (most relevant) path between two paths.
@@ -535,7 +542,6 @@ fn find_local_import_locations(
if !seen.insert(module) {
continue; // already processed this module
}
-
let ext_def_map;
let data = if module.krate == from.krate {
if module.block.is_some() {
@@ -571,7 +577,7 @@ fn find_local_import_locations(
// what the user wants; and if this module can import
// the item and we're a submodule of it, so can we.
// Also this keeps the cached data smaller.
- if is_pub_or_explicit || declared {
+ if declared || is_pub_or_explicit {
locations.push((module, name.clone()));
}
}
@@ -590,7 +596,10 @@ fn find_local_import_locations(
#[cfg(test)]
mod tests {
+ use expect_test::{expect, Expect};
use hir_expand::db::ExpandDatabase;
+ use itertools::Itertools;
+ use stdx::format_to;
use syntax::ast::AstNode;
use test_fixture::WithFixture;
@@ -602,12 +611,7 @@ mod tests {
/// item the `path` refers to returns that same path when called from the
/// module the cursor is in.
#[track_caller]
- fn check_found_path_(
- ra_fixture: &str,
- path: &str,
- prefix_kind: Option<PrefixKind>,
- prefer_prelude: bool,
- ) {
+ fn check_found_path_(ra_fixture: &str, path: &str, prefer_prelude: bool, expect: Expect) {
let (db, pos) = TestDB::with_position(ra_fixture);
let module = db.module_at_position(pos);
let parsed_path_file =
@@ -628,43 +632,48 @@ mod tests {
crate::item_scope::BuiltinShadowMode::Module,
None,
)
- .0
+ .0;
+ let resolved = resolved
.take_types()
- .expect("path does not resolve to a type");
+ .map(ItemInNs::Types)
+ .or_else(|| resolved.take_values().map(ItemInNs::Values))
+ .expect("path does not resolve to a type or value");
+
+ let mut res = String::new();
+ for (prefix, ignore_local_imports) in
+ [PrefixKind::Plain, PrefixKind::ByCrate, PrefixKind::BySelf]
+ .into_iter()
+ .cartesian_product([false, true])
+ {
+ let found_path = find_path_inner(
+ FindPathCtx {
+ prefer_no_std: false,
+ db: &db,
+ prefix,
+ prefer_prelude,
+ ignore_local_imports,
+ },
+ resolved,
+ module,
+ );
+ format_to!(
+ res,
+ "{:7}(imports {}): {}\n",
+ format!("{:?}", prefix),
+ if ignore_local_imports { '✖' } else { '✔' },
+ found_path
+ .map_or_else(|| "<unresolvable>".to_owned(), |it| it.display(&db).to_string()),
+ );
+ }
+ expect.assert_eq(&res);
+ }
- let found_path = find_path_inner(
- FindPathCtx { prefer_no_std: false, db: &db, prefixed: prefix_kind, prefer_prelude },
- ItemInNs::Types(resolved),
- module,
- );
- assert_eq!(found_path, Some(mod_path), "on kind: {prefix_kind:?}");
+ fn check_found_path(ra_fixture: &str, path: &str, expect: Expect) {
+ check_found_path_(ra_fixture, path, false, expect);
}
- #[track_caller]
- fn check_found_path(
- ra_fixture: &str,
- unprefixed: &str,
- prefixed: &str,
- absolute: &str,
- self_prefixed: &str,
- ) {
- check_found_path_(ra_fixture, unprefixed, None, false);
- check_found_path_(ra_fixture, prefixed, Some(PrefixKind::Plain), false);
- check_found_path_(ra_fixture, absolute, Some(PrefixKind::ByCrate), false);
- check_found_path_(ra_fixture, self_prefixed, Some(PrefixKind::BySelf), false);
- }
-
- fn check_found_path_prelude(
- ra_fixture: &str,
- unprefixed: &str,
- prefixed: &str,
- absolute: &str,
- self_prefixed: &str,
- ) {
- check_found_path_(ra_fixture, unprefixed, None, true);
- check_found_path_(ra_fixture, prefixed, Some(PrefixKind::Plain), true);
- check_found_path_(ra_fixture, absolute, Some(PrefixKind::ByCrate), true);
- check_found_path_(ra_fixture, self_prefixed, Some(PrefixKind::BySelf), true);
+ fn check_found_path_prelude(ra_fixture: &str, path: &str, expect: Expect) {
+ check_found_path_(ra_fixture, path, true, expect);
}
#[test]
@@ -675,9 +684,14 @@ struct S;
$0
"#,
"S",
- "S",
- "crate::S",
- "self::S",
+ expect![[r#"
+ Plain (imports ✔): S
+ Plain (imports ✖): S
+ ByCrate(imports ✔): crate::S
+ ByCrate(imports ✖): crate::S
+ BySelf (imports ✔): self::S
+ BySelf (imports ✖): self::S
+ "#]],
);
}
@@ -689,9 +703,14 @@ enum E { A }
$0
"#,
"E::A",
- "E::A",
- "crate::E::A",
- "self::E::A",
+ expect![[r#"
+ Plain (imports ✔): E::A
+ Plain (imports ✖): E::A
+ ByCrate(imports ✔): crate::E::A
+ ByCrate(imports ✖): crate::E::A
+ BySelf (imports ✔): self::E::A
+ BySelf (imports ✖): self::E::A
+ "#]],
);
}
@@ -705,9 +724,14 @@ mod foo {
$0
"#,
"foo::S",
- "foo::S",
- "crate::foo::S",
- "self::foo::S",
+ expect![[r#"
+ Plain (imports ✔): foo::S
+ Plain (imports ✖): foo::S
+ ByCrate(imports ✔): crate::foo::S
+ ByCrate(imports ✖): crate::foo::S
+ BySelf (imports ✔): self::foo::S
+ BySelf (imports ✖): self::foo::S
+ "#]],
);
}
@@ -724,9 +748,14 @@ struct S;
$0
"#,
"super::S",
- "super::S",
- "crate::foo::S",
- "super::S",
+ expect![[r#"
+ Plain (imports ✔): super::S
+ Plain (imports ✖): super::S
+ ByCrate(imports ✔): crate::foo::S
+ ByCrate(imports ✖): crate::foo::S
+ BySelf (imports ✔): super::S
+ BySelf (imports ✖): super::S
+ "#]],
);
}
@@ -740,9 +769,14 @@ mod foo;
$0
"#,
"self",
- "self",
- "crate::foo",
- "self",
+ expect![[r#"
+ Plain (imports ✔): self
+ Plain (imports ✖): self
+ ByCrate(imports ✔): crate::foo
+ ByCrate(imports ✖): crate::foo
+ BySelf (imports ✔): self
+ BySelf (imports ✖): self
+ "#]],
);
}
@@ -756,9 +790,14 @@ mod foo;
$0
"#,
"crate",
- "crate",
- "crate",
- "crate",
+ expect![[r#"
+ Plain (imports ✔): crate
+ Plain (imports ✖): crate
+ ByCrate(imports ✔): crate
+ ByCrate(imports ✖): crate
+ BySelf (imports ✔): crate
+ BySelf (imports ✖): crate
+ "#]],
);
}
@@ -773,9 +812,14 @@ struct S;
$0
"#,
"crate::S",
- "crate::S",
- "crate::S",
- "crate::S",
+ expect![[r#"
+ Plain (imports ✔): crate::S
+ Plain (imports ✖): crate::S
+ ByCrate(imports ✔): crate::S
+ ByCrate(imports ✖): crate::S
+ BySelf (imports ✔): crate::S
+ BySelf (imports ✖): crate::S
+ "#]],
);
}
@@ -789,9 +833,14 @@ $0
pub struct S;
"#,
"std::S",
- "std::S",
- "std::S",
- "std::S",
+ expect![[r#"
+ Plain (imports ✔): std::S
+ Plain (imports ✖): std::S
+ ByCrate(imports ✔): std::S
+ ByCrate(imports ✖): std::S
+ BySelf (imports ✔): std::S
+ BySelf (imports ✖): std::S
+ "#]],
);
}
@@ -806,9 +855,14 @@ $0
pub struct S;
"#,
"std_renamed::S",
- "std_renamed::S",
- "std_renamed::S",
- "std_renamed::S",
+ expect![[r#"
+ Plain (imports ✔): std_renamed::S
+ Plain (imports ✖): std_renamed::S
+ ByCrate(imports ✔): std_renamed::S
+ ByCrate(imports ✖): std_renamed::S
+ BySelf (imports ✔): std_renamed::S
+ BySelf (imports ✖): std_renamed::S
+ "#]],
);
}
@@ -831,10 +885,15 @@ pub mod ast {
}
}
"#,
- "ast::ModuleItem",
- "syntax::ast::ModuleItem",
- "syntax::ast::ModuleItem",
"syntax::ast::ModuleItem",
+ expect![[r#"
+ Plain (imports ✔): ast::ModuleItem
+ Plain (imports ✖): syntax::ast::ModuleItem
+ ByCrate(imports ✔): crate::ast::ModuleItem
+ ByCrate(imports ✖): syntax::ast::ModuleItem
+ BySelf (imports ✔): self::ast::ModuleItem
+ BySelf (imports ✖): syntax::ast::ModuleItem
+ "#]],
);
check_found_path(
@@ -850,9 +909,14 @@ pub mod ast {
}
"#,
"syntax::ast::ModuleItem",
- "syntax::ast::ModuleItem",
- "syntax::ast::ModuleItem",
- "syntax::ast::ModuleItem",
+ expect![[r#"
+ Plain (imports ✔): syntax::ast::ModuleItem
+ Plain (imports ✖): syntax::ast::ModuleItem
+ ByCrate(imports ✔): syntax::ast::ModuleItem
+ ByCrate(imports ✖): syntax::ast::ModuleItem
+ BySelf (imports ✔): syntax::ast::ModuleItem
+ BySelf (imports ✖): syntax::ast::ModuleItem
+ "#]],
);
}
@@ -867,9 +931,14 @@ mod bar {
$0
"#,
"bar::S",
- "bar::S",
- "crate::bar::S",
- "self::bar::S",
+ expect![[r#"
+ Plain (imports ✔): bar::S
+ Plain (imports ✖): bar::S
+ ByCrate(imports ✔): crate::bar::S
+ ByCrate(imports ✖): crate::bar::S
+ BySelf (imports ✔): self::bar::S
+ BySelf (imports ✖): self::bar::S
+ "#]],
);
}
@@ -884,9 +953,14 @@ mod bar {
$0
"#,
"bar::U",
- "bar::U",
- "crate::bar::U",
- "self::bar::U",
+ expect![[r#"
+ Plain (imports ✔): bar::U
+ Plain (imports ✖): bar::U
+ ByCrate(imports ✔): crate::bar::U
+ ByCrate(imports ✖): crate::bar::U
+ BySelf (imports ✔): self::bar::U
+ BySelf (imports ✖): self::bar::U
+ "#]],
);
}
@@ -902,9 +976,14 @@ pub use core::S;
pub struct S;
"#,
"std::S",
- "std::S",
- "std::S",
- "std::S",
+ expect![[r#"
+ Plain (imports ✔): std::S
+ Plain (imports ✖): std::S
+ ByCrate(imports ✔): std::S
+ ByCrate(imports ✖): std::S
+ BySelf (imports ✔): std::S
+ BySelf (imports ✖): std::S
+ "#]],
);
}
@@ -922,9 +1001,14 @@ pub mod prelude {
}
"#,
"S",
- "S",
- "S",
- "S",
+ expect![[r#"
+ Plain (imports ✔): S
+ Plain (imports ✖): S
+ ByCrate(imports ✔): S
+ ByCrate(imports ✖): S
+ BySelf (imports ✔): S
+ BySelf (imports ✖): S
+ "#]],
);
}
@@ -943,9 +1027,14 @@ pub mod prelude {
}
"#,
"std::prelude::rust_2018::S",
- "std::prelude::rust_2018::S",
- "std::prelude::rust_2018::S",
- "std::prelude::rust_2018::S",
+ expect![[r#"
+ Plain (imports ✔): std::prelude::rust_2018::S
+ Plain (imports ✖): std::prelude::rust_2018::S
+ ByCrate(imports ✔): std::prelude::rust_2018::S
+ ByCrate(imports ✖): std::prelude::rust_2018::S
+ BySelf (imports ✔): std::prelude::rust_2018::S
+ BySelf (imports ✖): std::prelude::rust_2018::S
+ "#]],
);
}
@@ -964,9 +1053,14 @@ pub mod prelude {
}
"#,
"S",
- "S",
- "S",
- "S",
+ expect![[r#"
+ Plain (imports ✔): S
+ Plain (imports ✖): S
+ ByCrate(imports ✔): crate::S
+ ByCrate(imports ✖): S
+ BySelf (imports ✔): self::S
+ BySelf (imports ✖): S
+ "#]],
);
}
@@ -983,8 +1077,30 @@ pub mod prelude {
}
}
"#;
- check_found_path(code, "None", "None", "None", "None");
- check_found_path(code, "Some", "Some", "Some", "Some");
+ check_found_path(
+ code,
+ "None",
+ expect![[r#"
+ Plain (imports ✔): None
+ Plain (imports ✖): None
+ ByCrate(imports ✔): None
+ ByCrate(imports ✖): None
+ BySelf (imports ✔): None
+ BySelf (imports ✖): None
+ "#]],
+ );
+ check_found_path(
+ code,
+ "Some",
+ expect![[r#"
+ Plain (imports ✔): Some
+ Plain (imports ✖): Some
+ ByCrate(imports ✔): Some
+ ByCrate(imports ✖): Some
+ BySelf (imports ✔): Some
+ BySelf (imports ✖): Some
+ "#]],
+ );
}
#[test]
@@ -1002,9 +1118,14 @@ pub mod bar { pub struct S; }
pub use crate::foo::bar::S;
"#,
"baz::S",
- "baz::S",
- "crate::baz::S",
- "self::baz::S",
+ expect![[r#"
+ Plain (imports ✔): baz::S
+ Plain (imports ✖): baz::S
+ ByCrate(imports ✔): crate::baz::S
+ ByCrate(imports ✖): crate::baz::S
+ BySelf (imports ✔): self::baz::S
+ BySelf (imports ✖): self::baz::S
+ "#]],
);
}
@@ -1022,9 +1143,14 @@ $0
"#,
// crate::S would be shorter, but using private imports seems wrong
"crate::bar::S",
- "crate::bar::S",
- "crate::bar::S",
- "crate::bar::S",
+ expect![[r#"
+ Plain (imports ✔): crate::bar::S
+ Plain (imports ✖): crate::bar::S
+ ByCrate(imports ✔): crate::bar::S
+ ByCrate(imports ✖): crate::bar::S
+ BySelf (imports ✔): crate::bar::S
+ BySelf (imports ✖): crate::bar::S
+ "#]],
);
}
@@ -1041,9 +1167,14 @@ pub(crate) use bar::S;
$0
"#,
"crate::S",
- "crate::S",
- "crate::S",
- "crate::S",
+ expect![[r#"
+ Plain (imports ✔): crate::S
+ Plain (imports ✖): crate::S
+ ByCrate(imports ✔): crate::S
+ ByCrate(imports ✖): crate::S
+ BySelf (imports ✔): crate::S
+ BySelf (imports ✖): crate::S
+ "#]],
);
}
@@ -1063,9 +1194,14 @@ pub mod bar {
$0
"#,
"super::S",
- "super::S",
- "crate::bar::S",
- "super::S",
+ expect![[r#"
+ Plain (imports ✔): super::S
+ Plain (imports ✖): super::S
+ ByCrate(imports ✔): crate::bar::S
+ ByCrate(imports ✖): crate::bar::S
+ BySelf (imports ✔): super::S
+ BySelf (imports ✖): super::S
+ "#]],
);
}
@@ -1086,9 +1222,14 @@ pub struct S;
pub use super::foo;
"#,
"crate::foo::S",
- "crate::foo::S",
- "crate::foo::S",
- "crate::foo::S",
+ expect![[r#"
+ Plain (imports ✔): crate::foo::S
+ Plain (imports ✖): crate::foo::S
+ ByCrate(imports ✔): crate::foo::S
+ ByCrate(imports ✖): crate::foo::S
+ BySelf (imports ✔): crate::foo::S
+ BySelf (imports ✖): crate::foo::S
+ "#]],
);
}
@@ -1110,9 +1251,14 @@ pub mod sync {
}
"#,
"std::sync::Arc",
- "std::sync::Arc",
- "std::sync::Arc",
- "std::sync::Arc",
+ expect![[r#"
+ Plain (imports ✔): std::sync::Arc
+ Plain (imports ✖): std::sync::Arc
+ ByCrate(imports ✔): std::sync::Arc
+ ByCrate(imports ✖): std::sync::Arc
+ BySelf (imports ✔): std::sync::Arc
+ BySelf (imports ✖): std::sync::Arc
+ "#]],
);
}
@@ -1138,9 +1284,14 @@ pub mod fmt {
}
"#,
"core::fmt::Error",
- "core::fmt::Error",
- "core::fmt::Error",
- "core::fmt::Error",
+ expect![[r#"
+ Plain (imports ✔): core::fmt::Error
+ Plain (imports ✖): core::fmt::Error
+ ByCrate(imports ✔): core::fmt::Error
+ ByCrate(imports ✖): core::fmt::Error
+ BySelf (imports ✔): core::fmt::Error
+ BySelf (imports ✖): core::fmt::Error
+ "#]],
);
// Should also work (on a best-effort basis) if `no_std` is conditional.
@@ -1164,9 +1315,14 @@ pub mod fmt {
}
"#,
"core::fmt::Error",
- "core::fmt::Error",
- "core::fmt::Error",
- "core::fmt::Error",
+ expect![[r#"
+ Plain (imports ✔): core::fmt::Error
+ Plain (imports ✖): core::fmt::Error
+ ByCrate(imports ✔): core::fmt::Error
+ ByCrate(imports ✖): core::fmt::Error
+ BySelf (imports ✔): core::fmt::Error
+ BySelf (imports ✖): core::fmt::Error
+ "#]],
);
}
@@ -1194,9 +1350,14 @@ pub mod sync {
}
"#,
"alloc::sync::Arc",
- "alloc::sync::Arc",
- "alloc::sync::Arc",
- "alloc::sync::Arc",
+ expect![[r#"
+ Plain (imports ✔): alloc::sync::Arc
+ Plain (imports ✖): alloc::sync::Arc
+ ByCrate(imports ✔): alloc::sync::Arc
+ ByCrate(imports ✖): alloc::sync::Arc
+ BySelf (imports ✔): alloc::sync::Arc
+ BySelf (imports ✖): alloc::sync::Arc
+ "#]],
);
}
@@ -1216,9 +1377,14 @@ pub mod sync {
pub struct Arc;
"#,
"megaalloc::Arc",
- "megaalloc::Arc",
- "megaalloc::Arc",
- "megaalloc::Arc",
+ expect![[r#"
+ Plain (imports ✔): megaalloc::Arc
+ Plain (imports ✖): megaalloc::Arc
+ ByCrate(imports ✔): megaalloc::Arc
+ ByCrate(imports ✖): megaalloc::Arc
+ BySelf (imports ✔): megaalloc::Arc
+ BySelf (imports ✖): megaalloc::Arc
+ "#]],
);
}
@@ -1231,8 +1397,30 @@ pub mod primitive {
pub use u8;
}
"#;
- check_found_path(code, "u8", "u8", "u8", "u8");
- check_found_path(code, "u16", "u16", "u16", "u16");
+ check_found_path(
+ code,
+ "u8",
+ expect![[r#"
+ Plain (imports ✔): u8
+ Plain (imports ✖): u8
+ ByCrate(imports ✔): u8
+ ByCrate(imports ✖): u8
+ BySelf (imports ✔): u8
+ BySelf (imports ✖): u8
+ "#]],
+ );
+ check_found_path(
+ code,
+ "u16",
+ expect![[r#"
+ Plain (imports ✔): u16
+ Plain (imports ✖): u16
+ ByCrate(imports ✔): u16
+ ByCrate(imports ✖): u16
+ BySelf (imports ✔): u16
+ BySelf (imports ✖): u16
+ "#]],
+ );
}
#[test]
@@ -1245,9 +1433,14 @@ fn main() {
}
"#,
"Inner",
- "Inner",
- "Inner",
- "Inner",
+ expect![[r#"
+ Plain (imports ✔): Inner
+ Plain (imports ✖): Inner
+ ByCrate(imports ✔): Inner
+ ByCrate(imports ✖): Inner
+ BySelf (imports ✔): Inner
+ BySelf (imports ✖): Inner
+ "#]],
);
}
@@ -1263,20 +1456,24 @@ fn main() {
}
"#,
"Struct",
- "Struct",
- "Struct",
- "Struct",
+ expect![[r#"
+ Plain (imports ✔): Struct
+ Plain (imports ✖): Struct
+ ByCrate(imports ✔): Struct
+ ByCrate(imports ✖): Struct
+ BySelf (imports ✔): Struct
+ BySelf (imports ✖): Struct
+ "#]],
);
}
#[test]
fn inner_items_from_inner_module() {
- cov_mark::check!(prefixed_in_block_expression);
check_found_path(
r#"
fn main() {
mod module {
- struct Struct {}
+ pub struct Struct {}
}
{
$0
@@ -1284,9 +1481,14 @@ fn main() {
}
"#,
"module::Struct",
- "module::Struct",
- "module::Struct",
- "module::Struct",
+ expect![[r#"
+ Plain (imports ✔): module::Struct
+ Plain (imports ✖): module::Struct
+ ByCrate(imports ✔): module::Struct
+ ByCrate(imports ✖): module::Struct
+ BySelf (imports ✔): module::Struct
+ BySelf (imports ✖): module::Struct
+ "#]],
);
}
@@ -1303,11 +1505,15 @@ fn main() {
$0
}
"#,
- // FIXME: these could use fewer/better prefixes
"module::CompleteMe",
- "crate::module::CompleteMe",
- "crate::module::CompleteMe",
- "crate::module::CompleteMe",
+ expect![[r#"
+ Plain (imports ✔): module::CompleteMe
+ Plain (imports ✖): module::CompleteMe
+ ByCrate(imports ✔): crate::module::CompleteMe
+ ByCrate(imports ✖): crate::module::CompleteMe
+ BySelf (imports ✔): self::module::CompleteMe
+ BySelf (imports ✖): self::module::CompleteMe
+ "#]],
)
}
@@ -1328,9 +1534,14 @@ mod bar {
}
"#,
"crate::baz::Foo",
- "crate::baz::Foo",
- "crate::baz::Foo",
- "crate::baz::Foo",
+ expect![[r#"
+ Plain (imports ✔): crate::baz::Foo
+ Plain (imports ✖): crate::baz::Foo
+ ByCrate(imports ✔): crate::baz::Foo
+ ByCrate(imports ✖): crate::baz::Foo
+ BySelf (imports ✔): crate::baz::Foo
+ BySelf (imports ✖): crate::baz::Foo
+ "#]],
)
}
@@ -1350,15 +1561,19 @@ mod bar {
}
"#,
"crate::baz::Foo",
- "crate::baz::Foo",
- "crate::baz::Foo",
- "crate::baz::Foo",
+ expect![[r#"
+ Plain (imports ✔): crate::baz::Foo
+ Plain (imports ✖): crate::baz::Foo
+ ByCrate(imports ✔): crate::baz::Foo
+ ByCrate(imports ✖): crate::baz::Foo
+ BySelf (imports ✔): crate::baz::Foo
+ BySelf (imports ✖): crate::baz::Foo
+ "#]],
)
}
#[test]
fn recursive_pub_mod_reexport() {
- cov_mark::check!(recursive_imports);
check_found_path(
r#"
fn main() {
@@ -1378,9 +1593,14 @@ pub mod name {
}
"#,
"name::AsName",
- "name::AsName",
- "crate::name::AsName",
- "self::name::AsName",
+ expect![[r#"
+ Plain (imports ✔): name::AsName
+ Plain (imports ✖): name::AsName
+ ByCrate(imports ✔): crate::name::AsName
+ ByCrate(imports ✖): crate::name::AsName
+ BySelf (imports ✔): self::name::AsName
+ BySelf (imports ✖): self::name::AsName
+ "#]],
);
}
@@ -1393,9 +1613,14 @@ $0
//- /dep.rs crate:dep
"#,
"dep",
- "dep",
- "dep",
- "dep",
+ expect![[r#"
+ Plain (imports ✔): dep
+ Plain (imports ✖): dep
+ ByCrate(imports ✔): dep
+ ByCrate(imports ✖): dep
+ BySelf (imports ✔): dep
+ BySelf (imports ✖): dep
+ "#]],
);
check_found_path(
@@ -1408,9 +1633,14 @@ fn f() {
//- /dep.rs crate:dep
"#,
"dep",
- "dep",
- "dep",
- "dep",
+ expect![[r#"
+ Plain (imports ✔): dep
+ Plain (imports ✖): dep
+ ByCrate(imports ✔): dep
+ ByCrate(imports ✖): dep
+ BySelf (imports ✔): dep
+ BySelf (imports ✖): dep
+ "#]],
);
}
@@ -1432,9 +1662,14 @@ pub mod prelude {
}
"#,
"None",
- "None",
- "None",
- "None",
+ expect![[r#"
+ Plain (imports ✔): None
+ Plain (imports ✖): None
+ ByCrate(imports ✔): None
+ ByCrate(imports ✖): None
+ BySelf (imports ✔): None
+ BySelf (imports ✖): None
+ "#]],
);
}
@@ -1450,9 +1685,14 @@ pub extern crate std as std_renamed;
pub struct S;
"#,
"intermediate::std_renamed::S",
- "intermediate::std_renamed::S",
- "intermediate::std_renamed::S",
- "intermediate::std_renamed::S",
+ expect![[r#"
+ Plain (imports ✔): intermediate::std_renamed::S
+ Plain (imports ✖): intermediate::std_renamed::S
+ ByCrate(imports ✔): intermediate::std_renamed::S
+ ByCrate(imports ✖): intermediate::std_renamed::S
+ BySelf (imports ✔): intermediate::std_renamed::S
+ BySelf (imports ✖): intermediate::std_renamed::S
+ "#]],
);
}
@@ -1470,9 +1710,14 @@ pub extern crate std as longer;
pub struct S;
"#,
"intermediate::longer::S",
- "intermediate::longer::S",
- "intermediate::longer::S",
- "intermediate::longer::S",
+ expect![[r#"
+ Plain (imports ✔): intermediate::longer::S
+ Plain (imports ✖): intermediate::longer::S
+ ByCrate(imports ✔): intermediate::longer::S
+ ByCrate(imports ✖): intermediate::longer::S
+ BySelf (imports ✔): intermediate::longer::S
+ BySelf (imports ✖): intermediate::longer::S
+ "#]],
);
}
@@ -1493,9 +1738,14 @@ pub mod ops {
}
"#,
"std::ops::Deref",
- "std::ops::Deref",
- "std::ops::Deref",
- "std::ops::Deref",
+ expect![[r#"
+ Plain (imports ✔): std::ops::Deref
+ Plain (imports ✖): std::ops::Deref
+ ByCrate(imports ✔): std::ops::Deref
+ ByCrate(imports ✖): std::ops::Deref
+ BySelf (imports ✔): std::ops::Deref
+ BySelf (imports ✖): std::ops::Deref
+ "#]],
);
}
@@ -1518,9 +1768,14 @@ pub mod error {
}
"#,
"std::error::Error",
- "std::error::Error",
- "std::error::Error",
- "std::error::Error",
+ expect![[r#"
+ Plain (imports ✔): std::error::Error
+ Plain (imports ✖): std::error::Error
+ ByCrate(imports ✔): std::error::Error
+ ByCrate(imports ✖): std::error::Error
+ BySelf (imports ✔): std::error::Error
+ BySelf (imports ✖): std::error::Error
+ "#]],
);
}
@@ -1541,16 +1796,26 @@ pub mod foo {
check_found_path(
ra_fixture,
"krate::foo::Foo",
- "krate::foo::Foo",
- "krate::foo::Foo",
- "krate::foo::Foo",
+ expect![[r#"
+ Plain (imports ✔): krate::foo::Foo
+ Plain (imports ✖): krate::foo::Foo
+ ByCrate(imports ✔): krate::foo::Foo
+ ByCrate(imports ✖): krate::foo::Foo
+ BySelf (imports ✔): krate::foo::Foo
+ BySelf (imports ✖): krate::foo::Foo
+ "#]],
);
check_found_path_prelude(
ra_fixture,
"krate::prelude::Foo",
- "krate::prelude::Foo",
- "krate::prelude::Foo",
- "krate::prelude::Foo",
+ expect![[r#"
+ Plain (imports ✔): krate::prelude::Foo
+ Plain (imports ✖): krate::prelude::Foo
+ ByCrate(imports ✔): krate::prelude::Foo
+ ByCrate(imports ✖): krate::prelude::Foo
+ BySelf (imports ✔): krate::prelude::Foo
+ BySelf (imports ✖): krate::prelude::Foo
+ "#]],
);
}
@@ -1582,9 +1847,40 @@ pub mod prelude {
}
"#,
"petgraph::graph::NodeIndex",
- "petgraph::graph::NodeIndex",
- "petgraph::graph::NodeIndex",
- "petgraph::graph::NodeIndex",
+ expect![[r#"
+ Plain (imports ✔): petgraph::graph::NodeIndex
+ Plain (imports ✖): petgraph::graph::NodeIndex
+ ByCrate(imports ✔): petgraph::graph::NodeIndex
+ ByCrate(imports ✖): petgraph::graph::NodeIndex
+ BySelf (imports ✔): petgraph::graph::NodeIndex
+ BySelf (imports ✖): petgraph::graph::NodeIndex
+ "#]],
+ );
+ }
+
+ #[test]
+ fn regression_17271() {
+ check_found_path(
+ r#"
+//- /lib.rs crate:main
+mod foo;
+
+//- /foo.rs
+mod bar;
+
+pub fn b() {$0}
+//- /foo/bar.rs
+pub fn c() {}
+"#,
+ "bar::c",
+ expect![[r#"
+ Plain (imports ✔): bar::c
+ Plain (imports ✖): bar::c
+ ByCrate(imports ✔): crate::foo::bar::c
+ ByCrate(imports ✖): crate::foo::bar::c
+ BySelf (imports ✔): self::bar::c
+ BySelf (imports ✖): self::bar::c
+ "#]],
);
}
}
diff --git a/crates/hir-def/src/import_map.rs b/crates/hir-def/src/import_map.rs
index faa1eed15a..6e40293dbf 100644
--- a/crates/hir-def/src/import_map.rs
+++ b/crates/hir-def/src/import_map.rs
@@ -1,13 +1,12 @@
//! A map of all publicly exported items in a crate.
-use std::{fmt, hash::BuildHasherDefault};
+use std::fmt;
use base_db::CrateId;
use fst::{raw::IndexedValue, Automaton, Streamer};
use hir_expand::name::Name;
-use indexmap::IndexMap;
use itertools::Itertools;
-use rustc_hash::{FxHashSet, FxHasher};
+use rustc_hash::FxHashSet;
use smallvec::SmallVec;
use stdx::{format_to, TupleExt};
use triomphe::Arc;
@@ -17,7 +16,7 @@ use crate::{
item_scope::{ImportOrExternCrate, ItemInNs},
nameres::DefMap,
visibility::Visibility,
- AssocItemId, ModuleDefId, ModuleId, TraitId,
+ AssocItemId, FxIndexMap, ModuleDefId, ModuleId, TraitId,
};
/// Item import details stored in the `ImportMap`.
@@ -58,7 +57,6 @@ enum IsTraitAssocItem {
No,
}
-type FxIndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<FxHasher>>;
type ImportMapIndex = FxIndexMap<ItemInNs, (SmallVec<[ImportInfo; 1]>, IsTraitAssocItem)>;
impl ImportMap {
diff --git a/crates/hir-def/src/item_scope.rs b/crates/hir-def/src/item_scope.rs
index 54cd57110e..9c7dfa05b0 100644
--- a/crates/hir-def/src/item_scope.rs
+++ b/crates/hir-def/src/item_scope.rs
@@ -295,7 +295,7 @@ impl ItemScope {
pub(crate) fn names_of<T>(
&self,
item: ItemInNs,
- mut cb: impl FnMut(&Name, Visibility, bool) -> Option<T>,
+ mut cb: impl FnMut(&Name, Visibility, /*declared*/ bool) -> Option<T>,
) -> Option<T> {
match item {
ItemInNs::Macros(def) => self
diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs
index 88d4572196..ca8cc1c3ea 100644
--- a/crates/hir-def/src/lib.rs
+++ b/crates/hir-def/src/lib.rs
@@ -106,6 +106,9 @@ use crate::{
},
};
+type FxIndexMap<K, V> =
+ indexmap::IndexMap<K, V, std::hash::BuildHasherDefault<rustc_hash::FxHasher>>;
+
#[derive(Debug)]
pub struct ItemLoc<N: ItemTreeNode> {
pub container: ModuleId,
@@ -455,6 +458,26 @@ impl ModuleId {
pub fn is_block_module(self) -> bool {
self.block.is_some() && self.local_id == DefMap::ROOT
}
+
+ pub fn is_within_block(self) -> bool {
+ self.block.is_some()
+ }
+
+ pub fn as_crate_root(&self) -> Option<CrateRootModuleId> {
+ if self.local_id == DefMap::ROOT && self.block.is_none() {
+ Some(CrateRootModuleId { krate: self.krate })
+ } else {
+ None
+ }
+ }
+
+ pub fn derive_crate_root(&self) -> CrateRootModuleId {
+ CrateRootModuleId { krate: self.krate }
+ }
+
+ fn is_crate_root(&self) -> bool {
+ self.local_id == DefMap::ROOT && self.block.is_none()
+ }
}
impl PartialEq<CrateRootModuleId> for ModuleId {
diff --git a/crates/hir-def/src/nameres.rs b/crates/hir-def/src/nameres.rs
index 497b69889a..a3eab22fc4 100644
--- a/crates/hir-def/src/nameres.rs
+++ b/crates/hir-def/src/nameres.rs
@@ -81,7 +81,7 @@ use crate::{
per_ns::PerNs,
visibility::{Visibility, VisibilityExplicitness},
AstId, BlockId, BlockLoc, CrateRootModuleId, EnumId, EnumVariantId, ExternCrateId, FunctionId,
- LocalModuleId, Lookup, MacroExpander, MacroId, ModuleId, ProcMacroId, UseId,
+ FxIndexMap, LocalModuleId, Lookup, MacroExpander, MacroId, ModuleId, ProcMacroId, UseId,
};
const PREDEFINED_TOOLS: &[SmolStr] = &[
@@ -137,7 +137,7 @@ pub struct DefMap {
#[derive(Clone, Debug, PartialEq, Eq)]
struct DefMapCrateData {
/// The extern prelude which contains all root modules of external crates that are in scope.
- extern_prelude: FxHashMap<Name, (CrateRootModuleId, Option<ExternCrateId>)>,
+ extern_prelude: FxIndexMap<Name, (CrateRootModuleId, Option<ExternCrateId>)>,
/// Side table for resolving derive helpers.
exported_derives: FxHashMap<MacroDefId, Box<[Name]>>,
@@ -163,7 +163,7 @@ struct DefMapCrateData {
impl DefMapCrateData {
fn new(edition: Edition) -> Self {
Self {
- extern_prelude: FxHashMap::default(),
+ extern_prelude: FxIndexMap::default(),
exported_derives: FxHashMap::default(),
fn_proc_macro_mapping: FxHashMap::default(),
proc_macro_loading_error: None,
@@ -586,7 +586,8 @@ impl DefMap {
pub(crate) fn extern_prelude(
&self,
- ) -> impl Iterator<Item = (&Name, (CrateRootModuleId, Option<ExternCrateId>))> + '_ {
+ ) -> impl DoubleEndedIterator<Item = (&Name, (CrateRootModuleId, Option<ExternCrateId>))> + '_
+ {
self.data.extern_prelude.iter().map(|(name, &def)| (name, def))
}
diff --git a/crates/hir-def/src/resolver.rs b/crates/hir-def/src/resolver.rs
index 1602b17385..9794963203 100644
--- a/crates/hir-def/src/resolver.rs
+++ b/crates/hir-def/src/resolver.rs
@@ -1,12 +1,11 @@
//! Name resolution façade.
-use std::{fmt, hash::BuildHasherDefault, iter, mem};
+use std::{fmt, iter, mem};
use base_db::CrateId;
use hir_expand::{
name::{name, Name},
MacroDefId,
};
-use indexmap::IndexMap;
use intern::Interned;
use rustc_hash::FxHashSet;
use smallvec::{smallvec, SmallVec};
@@ -27,10 +26,10 @@ use crate::{
type_ref::LifetimeRef,
visibility::{RawVisibility, Visibility},
AdtId, ConstId, ConstParamId, CrateRootModuleId, DefWithBodyId, EnumId, EnumVariantId,
- ExternBlockId, ExternCrateId, FunctionId, GenericDefId, GenericParamId, HasModule, ImplId,
- ItemContainerId, ItemTreeLoc, LifetimeParamId, LocalModuleId, Lookup, Macro2Id, MacroId,
- MacroRulesId, ModuleDefId, ModuleId, ProcMacroId, StaticId, StructId, TraitAliasId, TraitId,
- TypeAliasId, TypeOrConstParamId, TypeOwnerId, TypeParamId, UseId, VariantId,
+ ExternBlockId, ExternCrateId, FunctionId, FxIndexMap, GenericDefId, GenericParamId, HasModule,
+ ImplId, ItemContainerId, ItemTreeLoc, LifetimeParamId, LocalModuleId, Lookup, Macro2Id,
+ MacroId, MacroRulesId, ModuleDefId, ModuleId, ProcMacroId, StaticId, StructId, TraitAliasId,
+ TraitId, TypeAliasId, TypeOrConstParamId, TypeOwnerId, TypeParamId, UseId, VariantId,
};
#[derive(Debug, Clone)]
@@ -957,7 +956,6 @@ fn to_type_ns(per_ns: PerNs) -> Option<(TypeNs, Option<ImportOrExternCrate>)> {
Some((res, import))
}
-type FxIndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<rustc_hash::FxHasher>>;
#[derive(Default)]
struct ScopeNames {
map: FxIndexMap<Name, SmallVec<[ScopeDef; 1]>>,
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index c010f5d22b..82bbc28884 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -13,7 +13,7 @@ use either::Either;
use hir_def::{
data::adt::VariantData,
db::DefDatabase,
- find_path,
+ find_path::{self, PrefixKind},
generics::{TypeOrConstParamData, TypeParamProvenance},
item_scope::ItemInNs,
lang_item::{LangItem, LangItemTarget},
@@ -999,6 +999,8 @@ impl HirDisplay for Ty {
db.upcast(),
ItemInNs::Types((*def_id).into()),
module_id,
+ PrefixKind::Plain,
+ false,
false,
true,
) {
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 82d2bbb6cf..7f0b0cd48c 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -788,7 +788,7 @@ impl Module {
/// Finds a path that can be used to refer to the given item from within
/// this module, if possible.
- pub fn find_use_path(
+ pub fn find_path(
self,
db: &dyn DefDatabase,
item: impl Into<ItemInNs>,
@@ -799,6 +799,8 @@ impl Module {
db,
item.into().into(),
self.into(),
+ PrefixKind::Plain,
+ false,
prefer_no_std,
prefer_prelude,
)
@@ -806,7 +808,7 @@ impl Module {
/// Finds a path that can be used to refer to the given item from within
/// this module, if possible. This is used for returning import paths for use-statements.
- pub fn find_use_path_prefixed(
+ pub fn find_use_path(
self,
db: &dyn DefDatabase,
item: impl Into<ItemInNs>,
@@ -814,11 +816,12 @@ impl Module {
prefer_no_std: bool,
prefer_prelude: bool,
) -> Option<ModPath> {
- hir_def::find_path::find_path_prefixed(
+ hir_def::find_path::find_path(
db,
item.into().into(),
self.into(),
prefix_kind,
+ true,
prefer_no_std,
prefer_prelude,
)
diff --git a/crates/hir/src/term_search/expr.rs b/crates/hir/src/term_search/expr.rs
index 9f56a1ee55..3cbe0d217c 100644
--- a/crates/hir/src/term_search/expr.rs
+++ b/crates/hir/src/term_search/expr.rs
@@ -1,6 +1,5 @@
//! Type tree for term search
-use hir_def::find_path::PrefixKind;
use hir_expand::mod_path::ModPath;
use hir_ty::{
db::HirDatabase,
@@ -21,28 +20,8 @@ fn mod_item_path(
prefer_prelude: bool,
) -> Option<ModPath> {
let db = sema_scope.db;
- // Account for locals shadowing items from module
- let name_hit_count = def.name(db).map(|def_name| {
- let mut name_hit_count = 0;
- sema_scope.process_all_names(&mut |name, _| {
- if name == def_name {
- name_hit_count += 1;
- }
- });
- name_hit_count
- });
-
let m = sema_scope.module();
- match name_hit_count {
- Some(0..=1) | None => m.find_use_path(db.upcast(), *def, prefer_no_std, prefer_prelude),
- Some(_) => m.find_use_path_prefixed(
- db.upcast(),
- *def,
- PrefixKind::ByCrate,
- prefer_no_std,
- prefer_prelude,
- ),
- }
+ m.find_path(db.upcast(), *def, prefer_no_std, prefer_prelude)
}
/// Helper function to get path to `ModuleDef` as string
diff --git a/crates/ide-assists/src/handlers/add_missing_match_arms.rs b/crates/ide-assists/src/handlers/add_missing_match_arms.rs
index 5ef374506e..8eddc562be 100644
--- a/crates/ide-assists/src/handlers/add_missing_match_arms.rs
+++ b/crates/ide-assists/src/handlers/add_missing_match_arms.rs
@@ -462,7 +462,7 @@ fn build_pat(
) -> Option<ast::Pat> {
match var {
ExtendedVariant::Variant(var) => {
- let path = mod_path_to_ast(&module.find_use_path(
+ let path = mod_path_to_ast(&module.find_path(
db,
ModuleDef::from(var),
prefer_no_std,
diff --git a/crates/ide-assists/src/handlers/bool_to_enum.rs b/crates/ide-assists/src/handlers/bool_to_enum.rs
index fd3a0506ab..934d1f3b65 100644
--- a/crates/ide-assists/src/handlers/bool_to_enum.rs
+++ b/crates/ide-assists/src/handlers/bool_to_enum.rs
@@ -341,7 +341,7 @@ fn augment_references_with_imports(
let import_scope = ImportScope::find_insert_use_container(name.syntax(), &ctx.sema);
let path = ref_module
- .find_use_path_prefixed(
+ .find_use_path(
ctx.sema.db,
ModuleDef::Module(*target_module),
ctx.config.insert_use.prefix_kind,
@@ -1521,7 +1521,7 @@ mod foo {
}
"#,
r#"
-use crate::foo::Bool;
+use foo::Bool;
fn main() {
use foo::FOO;
@@ -1602,7 +1602,7 @@ pub mod bar {
"#,
r#"
//- /main.rs
-use crate::foo::bar::Bool;
+use foo::bar::Bool;
mod foo;
diff --git a/crates/ide-assists/src/handlers/convert_into_to_from.rs b/crates/ide-assists/src/handlers/convert_into_to_from.rs
index d649f13d6e..e0e2ac7585 100644
--- a/crates/ide-assists/src/handlers/convert_into_to_from.rs
+++ b/crates/ide-assists/src/handlers/convert_into_to_from.rs
@@ -50,7 +50,7 @@ pub(crate) fn convert_into_to_from(acc: &mut Assists, ctx: &AssistContext<'_>) -
_ => return None,
};
- mod_path_to_ast(&module.find_use_path(
+ mod_path_to_ast(&module.find_path(
ctx.db(),
src_type_def,
ctx.config.prefer_no_std,
diff --git a/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs b/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs
index 41366658a7..1f579d4221 100644
--- a/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs
+++ b/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs
@@ -201,7 +201,7 @@ fn augment_references_with_imports(
let import_scope =
ImportScope::find_insert_use_container(new_name.syntax(), &ctx.sema);
let path = ref_module
- .find_use_path_prefixed(
+ .find_use_path(
ctx.sema.db,
ModuleDef::Module(*target_module),
ctx.config.insert_use.prefix_kind,
@@ -811,7 +811,7 @@ pub mod bar {
"#,
r#"
//- /main.rs
-use crate::foo::bar::BarResult;
+use foo::bar::BarResult;
mod foo;
diff --git a/crates/ide-assists/src/handlers/destructure_struct_binding.rs b/crates/ide-assists/src/handlers/destructure_struct_binding.rs
index c1a3f93026..bdcefe0b4f 100644
--- a/crates/ide-assists/src/handlers/destructure_struct_binding.rs
+++ b/crates/ide-assists/src/handlers/destructure_struct_binding.rs
@@ -90,7 +90,7 @@ fn collect_data(ident_pat: ast::IdentPat, ctx: &AssistContext<'_>) -> Option<Str
let module = ctx.sema.scope(ident_pat.syntax())?.module();
let struct_def = hir::ModuleDef::from(struct_type);
let kind = struct_type.kind(ctx.db());
- let struct_def_path = module.find_use_path(
+ let struct_def_path = module.find_path(
ctx.db(),
struct_def,
ctx.config.prefer_no_std,
diff --git a/crates/ide-assists/src/handlers/extract_function.rs b/crates/ide-assists/src/handlers/extract_function.rs
index 2b8de3443b..b4fd616f72 100644
--- a/crates/ide-assists/src/handlers/extract_function.rs
+++ b/crates/ide-assists/src/handlers/extract_function.rs
@@ -209,7 +209,7 @@ pub(crate) fn extract_function(acc: &mut Assists, ctx: &AssistContext<'_>) -> Op
FamousDefs(&ctx.sema, module.krate()).core_ops_ControlFlow();
if let Some(control_flow_enum) = control_flow_enum {
- let mod_path = module.find_use_path_prefixed(
+ let mod_path = module.find_use_path(
ctx.sema.db,
ModuleDef::from(control_flow_enum),
ctx.config.insert_use.prefix_kind,
diff --git a/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs b/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
index 81a639e0b9..2e4541b181 100644
--- a/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
+++ b/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
@@ -386,7 +386,7 @@ fn process_references(
let segment = builder.make_mut(segment);
let scope_node = builder.make_syntax_mut(scope_node);
if !visited_modules.contains(&module) {
- let mod_path = module.find_use_path_prefixed(
+ let mod_path = module.find_use_path(
ctx.sema.db,
*enum_module_def,
ctx.config.insert_use.prefix_kind,
@@ -881,7 +881,7 @@ fn another_fn() {
r#"use my_mod::my_other_mod::MyField;
mod my_mod {
- use self::my_other_mod::MyField;
+ use my_other_mod::MyField;
fn another_fn() {
let m = my_other_mod::MyEnum::MyField(MyField(1, 1));
diff --git a/crates/ide-assists/src/handlers/generate_deref.rs b/crates/ide-assists/src/handlers/generate_deref.rs
index 473c699b59..54c320a39b 100644
--- a/crates/ide-assists/src/handlers/generate_deref.rs
+++ b/crates/ide-assists/src/handlers/generate_deref.rs
@@ -58,7 +58,7 @@ fn generate_record_deref(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
let module = ctx.sema.to_def(&strukt)?.module(ctx.db());
let trait_ = deref_type_to_generate.to_trait(&ctx.sema, module.krate())?;
- let trait_path = module.find_use_path(
+ let trait_path = module.find_path(
ctx.db(),
ModuleDef::Trait(trait_),
ctx.config.prefer_no_std,
@@ -103,7 +103,7 @@ fn generate_tuple_deref(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()
let module = ctx.sema.to_def(&strukt)?.module(ctx.db());
let trait_ = deref_type_to_generate.to_trait(&ctx.sema, module.krate())?;
- let trait_path = module.find_use_path(
+ let trait_path = module.find_path(
ctx.db(),
ModuleDef::Trait(trait_),
ctx.config.prefer_no_std,
diff --git a/crates/ide-assists/src/handlers/generate_new.rs b/crates/ide-assists/src/handlers/generate_new.rs
index 22c75cd5ee..50342b0284 100644
--- a/crates/ide-assists/src/handlers/generate_new.rs
+++ b/crates/ide-assists/src/handlers/generate_new.rs
@@ -58,7 +58,7 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option
let item_in_ns = hir::ItemInNs::from(hir::ModuleDef::from(ty.as_adt()?));
- let type_path = current_module.find_use_path(
+ let type_path = current_module.find_path(
ctx.sema.db,
item_for_path_search(ctx.sema.db, item_in_ns)?,
ctx.config.prefer_no_std,
diff --git a/crates/ide-assists/src/handlers/qualify_method_call.rs b/crates/ide-assists/src/handlers/qualify_method_call.rs
index ff65aac82e..196b33e0f6 100644
--- a/crates/ide-assists/src/handlers/qualify_method_call.rs
+++ b/crates/ide-assists/src/handlers/qualify_method_call.rs
@@ -44,7 +44,7 @@ pub(crate) fn qualify_method_call(acc: &mut Assists, ctx: &AssistContext<'_>) ->
let current_module = ctx.sema.scope(call.syntax())?.module();
let target_module_def = ModuleDef::from(resolved_call);
let item_in_ns = ItemInNs::from(target_module_def);
- let receiver_path = current_module.find_use_path(
+ let receiver_path = current_module.find_path(
ctx.sema.db,
item_for_path_search(ctx.sema.db, item_in_ns)?,
ctx.config.prefer_no_std,
diff --git a/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs b/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs
index 3420d906de..8cc7c883f4 100644
--- a/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs
+++ b/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs
@@ -83,7 +83,7 @@ pub(crate) fn replace_derive_with_manual_impl(
})
.flat_map(|trait_| {
current_module
- .find_use_path(
+ .find_path(
ctx.sema.db,
hir::ModuleDef::Trait(trait_),
ctx.config.prefer_no_std,
diff --git a/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs b/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
index ba1c25fa5a..cb9de32d9c 100644
--- a/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
+++ b/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
@@ -63,7 +63,7 @@ pub(crate) fn replace_qualified_name_with_use(
);
let path_to_qualifier = starts_with_name_ref
.then(|| {
- ctx.sema.scope(path.syntax())?.module().find_use_path_prefixed(
+ ctx.sema.scope(path.syntax())?.module().find_use_path(
ctx.sema.db,
module,
ctx.config.insert_use.prefix_kind,
diff --git a/crates/ide-completion/src/completions.rs b/crates/ide-completion/src/completions.rs
index 1ea7220960..69b0289fc1 100644
--- a/crates/ide-completion/src/completions.rs
+++ b/crates/ide-completion/src/completions.rs
@@ -633,7 +633,7 @@ fn enum_variants_with_paths(
}
for variant in variants {
- if let Some(path) = ctx.module.find_use_path(
+ if let Some(path) = ctx.module.find_path(
ctx.db,
hir::ModuleDef::from(variant),
ctx.config.prefer_no_std,
diff --git a/crates/ide-completion/src/completions/expr.rs b/crates/ide-completion/src/completions/expr.rs
index 1e31d65fdd..f350c2743c 100644
--- a/crates/ide-completion/src/completions/expr.rs
+++ b/crates/ide-completion/src/completions/expr.rs
@@ -171,7 +171,7 @@ pub(crate) fn complete_expr_path(
hir::Adt::Struct(strukt) => {
let path = ctx
.module
- .find_use_path(
+ .find_path(
ctx.db,
hir::ModuleDef::from(strukt),
ctx.config.prefer_no_std,
@@ -194,7 +194,7 @@ pub(crate) fn complete_expr_path(
hir::Adt::Union(un) => {
let path = ctx
.module
- .find_use_path(
+ .find_path(
ctx.db,
hir::ModuleDef::from(un),
ctx.config.prefer_no_std,
diff --git a/crates/ide-completion/src/completions/postfix.rs b/crates/ide-completion/src/completions/postfix.rs
index c6e243b31a..c14da34874 100644
--- a/crates/ide-completion/src/completions/postfix.rs
+++ b/crates/ide-completion/src/completions/postfix.rs
@@ -63,7 +63,7 @@ pub(crate) fn complete_postfix(
if let Some(drop_trait) = ctx.famous_defs().core_ops_Drop() {
if receiver_ty.impls_trait(ctx.db, drop_trait, &[]) {
if let Some(drop_fn) = ctx.famous_defs().core_mem_drop() {
- if let Some(path) = ctx.module.find_use_path(
+ if let Some(path) = ctx.module.find_path(
ctx.db,
ItemInNs::Values(drop_fn.into()),
ctx.config.prefer_no_std,
diff --git a/crates/ide-completion/src/lib.rs b/crates/ide-completion/src/lib.rs
index d89cfc8b6c..4165dd48af 100644
--- a/crates/ide-completion/src/lib.rs
+++ b/crates/ide-completion/src/lib.rs
@@ -260,7 +260,7 @@ pub fn resolve_completion_edits(
);
let import = items_with_name
.filter_map(|candidate| {
- current_module.find_use_path_prefixed(
+ current_module.find_use_path(
db,
candidate,
config.insert_use.prefix_kind,
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs
index 7fa31e2757..d7b27f8b3b 100644
--- a/crates/ide-completion/src/render.rs
+++ b/crates/ide-completion/src/render.rs
@@ -333,7 +333,7 @@ pub(crate) fn render_expr(
});
for trait_ in expr.traits_used(ctx.db) {
let trait_item = hir::ItemInNs::from(hir::ModuleDef::from(trait_));
- let Some(path) = ctx.module.find_use_path(
+ let Some(path) = ctx.module.find_path(
ctx.db,
trait_item,
ctx.config.prefer_no_std,
diff --git a/crates/ide-completion/src/snippet.rs b/crates/ide-completion/src/snippet.rs
index 7d710f1e13..37bb6cfef0 100644
--- a/crates/ide-completion/src/snippet.rs
+++ b/crates/ide-completion/src/snippet.rs
@@ -174,7 +174,7 @@ fn import_edits(ctx: &CompletionContext<'_>, requires: &[GreenNode]) -> Option<V
hir::PathResolution::Def(def) => def.into(),
_ => return None,
};
- let path = ctx.module.find_use_path_prefixed(
+ let path = ctx.module.find_use_path(
ctx.db,
item,
ctx.config.insert_use.prefix_kind,
diff --git a/crates/ide-db/src/imports/import_assets.rs b/crates/ide-db/src/imports/import_assets.rs
index 766bfcf4d0..530020f116 100644
--- a/crates/ide-db/src/imports/import_assets.rs
+++ b/crates/ide-db/src/imports/import_assets.rs
@@ -638,7 +638,7 @@ fn get_mod_path(
prefer_prelude: bool,
) -> Option<ModPath> {
if let Some(prefix_kind) = prefixed {
- module_with_candidate.find_use_path_prefixed(
+ module_with_candidate.find_use_path(
db,
item_to_search,
prefix_kind,
@@ -646,7 +646,7 @@ fn get_mod_path(
prefer_prelude,
)
} else {
- module_with_candidate.find_use_path(db, item_to_search, prefer_no_std, prefer_prelude)
+ module_with_candidate.find_path(db, item_to_search, prefer_no_std, prefer_prelude)
}
}
diff --git a/crates/ide-db/src/path_transform.rs b/crates/ide-db/src/path_transform.rs
index 7e1811b4ca..6f4f97e0b8 100644
--- a/crates/ide-db/src/path_transform.rs
+++ b/crates/ide-db/src/path_transform.rs
@@ -308,7 +308,7 @@ impl Ctx<'_> {
parent.segment()?.name_ref()?,
)
.and_then(|trait_ref| {
- let found_path = self.target_module.find_use_path(
+ let found_path = self.target_module.find_path(
self.source_scope.db.upcast(),
hir::ModuleDef::Trait(trait_ref),
false,
@@ -347,7 +347,7 @@ impl Ctx<'_> {
}
}
- let found_path = self.target_module.find_use_path(
+ let found_path = self.target_module.find_path(
self.source_scope.db.upcast(),
def,
false,
@@ -385,7 +385,7 @@ impl Ctx<'_> {
if let Some(adt) = ty.as_adt() {
if let ast::Type::PathType(path_ty) = &ast_ty {
- let found_path = self.target_module.find_use_path(
+ let found_path = self.target_module.find_path(
self.source_scope.db.upcast(),
ModuleDef::from(adt),
false,
diff --git a/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs b/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs
index b3dde977b1..71958bc866 100644
--- a/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs
+++ b/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs
@@ -144,7 +144,7 @@ pub(crate) fn json_in_items(
let current_module = semantics_scope.module();
if !scope_has("Serialize") {
if let Some(PathResolution::Def(it)) = serialize_resolved {
- if let Some(it) = current_module.find_use_path_prefixed(
+ if let Some(it) = current_module.find_use_path(
sema.db,
it,
config.insert_use.prefix_kind,
@@ -157,7 +157,7 @@ pub(crate) fn json_in_items(
}
if !scope_has("Deserialize") {
if let Some(PathResolution::Def(it)) = deserialize_resolved {
- if let Some(it) = current_module.find_use_path_prefixed(
+ if let Some(it) = current_module.find_use_path(
sema.db,
it,
config.insert_use.prefix_kind,
diff --git a/crates/ide-diagnostics/src/handlers/missing_fields.rs b/crates/ide-diagnostics/src/handlers/missing_fields.rs
index f92ba576d3..ed9094f1f3 100644
--- a/crates/ide-diagnostics/src/handlers/missing_fields.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_fields.rs
@@ -122,7 +122,7 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass
let expr = (|| -> Option<ast::Expr> {
let item_in_ns = hir::ItemInNs::from(hir::ModuleDef::from(ty.as_adt()?));
- let type_path = current_module?.find_use_path(
+ let type_path = current_module?.find_path(
ctx.sema.db,
item_for_path_search(ctx.sema.db, item_in_ns)?,
ctx.config.prefer_no_std,
diff --git a/crates/ide-diagnostics/src/handlers/typed_hole.rs b/crates/ide-diagnostics/src/handlers/typed_hole.rs
index 656d79dc73..b819cc5b24 100644
--- a/crates/ide-diagnostics/src/handlers/typed_hole.rs
+++ b/crates/ide-diagnostics/src/handlers/typed_hole.rs
@@ -368,6 +368,7 @@ fn main() {
);
}
+ // FIXME
#[test]
fn local_shadow_fn() {
check_fixes_unordered(
@@ -385,7 +386,7 @@ fn f() {
r#"
fn f() {
let f: i32 = 0;
- crate::f()
+ f()
}"#,
],
);
diff --git a/crates/ide-ssr/src/matching.rs b/crates/ide-ssr/src/matching.rs
index cfda1c692a..99df3f2563 100644
--- a/crates/ide-ssr/src/matching.rs
+++ b/crates/ide-ssr/src/matching.rs
@@ -664,7 +664,7 @@ impl Match {
for (path, resolved_path) in &template.resolved_paths {
if let hir::PathResolution::Def(module_def) = resolved_path.resolution {
let mod_path =
- module.find_use_path(sema.db, module_def, false, true).ok_or_else(|| {
+ module.find_path(sema.db, module_def, false, true).ok_or_else(|| {
match_error!("Failed to render template path `{}` at match location")
})?;
self.rendered_template_paths.insert(path.clone(), mod_path);