diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-05-13 16:48:11 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-13 16:48:11 +0000 |
| commit | 908cd23f81d94bc53e318089fd8bd52e27906f19 (patch) | |
| tree | e6952fde6a75c80a0f587c061abde926d8d3ebfe | |
| parent | c9c9b4e9eda37bcc837fede4528a54dd20dc3989 (diff) | |
| parent | 69e0b10150a3a426e7796841156e788c3866b27c (diff) | |
| download | rust-908cd23f81d94bc53e318089fd8bd52e27906f19.tar.gz rust-908cd23f81d94bc53e318089fd8bd52e27906f19.zip | |
Merge #8820
8820: fix: Return absolute paths in find_path if crate start is ambiguous r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
| -rw-r--r-- | crates/hir_def/src/find_path.rs | 13 | ||||
| -rw-r--r-- | crates/ide_assists/src/handlers/auto_import.rs | 26 |
2 files changed, 37 insertions, 2 deletions
diff --git a/crates/hir_def/src/find_path.rs b/crates/hir_def/src/find_path.rs index 858e8803810..ee52794aa87 100644 --- a/crates/hir_def/src/find_path.rs +++ b/crates/hir_def/src/find_path.rs @@ -5,10 +5,10 @@ use std::iter; use hir_expand::name::{known, AsName, Name}; use rustc_hash::FxHashSet; -use crate::nameres::DefMap; use crate::{ db::DefDatabase, item_scope::ItemInNs, + nameres::DefMap, path::{ModPath, PathKind}, visibility::Visibility, ModuleDefId, ModuleId, @@ -134,7 +134,16 @@ fn find_path_inner( for (name, def_id) in root_def_map.extern_prelude() { if item == ItemInNs::Types(*def_id) { let name = scope_name.unwrap_or_else(|| name.clone()); - return Some(ModPath::from_segments(PathKind::Plain, vec![name])); + + let name_already_occupied_in_type_ns = def_map + .with_ancestor_maps(db, from.local_id, &mut |def_map, local_id| { + def_map[local_id].scope.get(&name).take_types().filter(|&id| id != *def_id) + }) + .is_some(); + return Some(ModPath::from_segments( + if name_already_occupied_in_type_ns { PathKind::Abs } else { PathKind::Plain }, + vec![name], + )); } } diff --git a/crates/ide_assists/src/handlers/auto_import.rs b/crates/ide_assists/src/handlers/auto_import.rs index a454a2af329..506cc292c41 100644 --- a/crates/ide_assists/src/handlers/auto_import.rs +++ b/crates/ide_assists/src/handlers/auto_import.rs @@ -969,4 +969,30 @@ mod bar { "#, ); } + + #[test] + fn uses_abs_path_with_extern_crate_clash() { + check_assist( + auto_import, + r#" +//- /main.rs crate:main deps:foo +mod foo {} + +const _: () = { + Foo$0 +}; +//- /foo.rs crate:foo +pub struct Foo +"#, + r#" +use ::foo::Foo; + +mod foo {} + +const _: () = { + Foo +}; +"#, + ); + } } |
