From 9482353fa8e1e88cb720a029b9bb6304819c7399 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Sun, 28 Feb 2021 09:57:54 +0200 Subject: Properly handle turbofishes in qualifiers --- crates/hir_def/src/path.rs | 4 ++++ crates/ide_assists/src/handlers/auto_import.rs | 2 +- crates/ide_assists/src/handlers/qualify_path.rs | 2 +- crates/ide_completion/src/completions/flyimport.rs | 2 +- crates/ide_db/src/helpers/import_assets.rs | 12 +++++++----- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/crates/hir_def/src/path.rs b/crates/hir_def/src/path.rs index 0e60dc2b6..1dc085199 100644 --- a/crates/hir_def/src/path.rs +++ b/crates/hir_def/src/path.rs @@ -44,6 +44,10 @@ pub enum ImportAlias { } impl ModPath { + pub fn from_src_unhygienic(path: ast::Path) -> Option { + lower::lower_path(path, &Hygiene::new_unhygienic()).map(|it| it.mod_path) + } + pub fn from_src(path: ast::Path, hygiene: &Hygiene) -> Option { lower::lower_path(path, hygiene).map(|it| it.mod_path) } diff --git a/crates/ide_assists/src/handlers/auto_import.rs b/crates/ide_assists/src/handlers/auto_import.rs index 7188724be..e9993a7cc 100644 --- a/crates/ide_assists/src/handlers/auto_import.rs +++ b/crates/ide_assists/src/handlers/auto_import.rs @@ -242,7 +242,7 @@ mod tests { } ", r" - use PubMod3::PubStruct; + use PubMod1::PubStruct; PubStruct diff --git a/crates/ide_assists/src/handlers/qualify_path.rs b/crates/ide_assists/src/handlers/qualify_path.rs index a40cdd80e..261178448 100644 --- a/crates/ide_assists/src/handlers/qualify_path.rs +++ b/crates/ide_assists/src/handlers/qualify_path.rs @@ -313,7 +313,7 @@ mod tests { } ", r" - PubMod3::PubStruct + PubMod1::PubStruct pub mod PubMod1 { pub struct PubStruct; diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index e33fc4b78..af49fdd26 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -669,8 +669,8 @@ fn main() { } "#, expect![[r#" - ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED fn weird_function() (dep::test_mod::TestTrait) -> () DEPRECATED + ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED "#]], ); } diff --git a/crates/ide_db/src/helpers/import_assets.rs b/crates/ide_db/src/helpers/import_assets.rs index 3d79f9771..2e7a183d1 100644 --- a/crates/ide_db/src/helpers/import_assets.rs +++ b/crates/ide_db/src/helpers/import_assets.rs @@ -43,7 +43,7 @@ pub struct PathImportCandidate { #[derive(Debug)] pub enum Qualifier { Absent, - FirstSegmentUnresolved(ast::PathSegment, ast::Path), + FirstSegmentUnresolved(ast::NameRef, ModPath), } #[derive(Debug)] @@ -297,8 +297,7 @@ fn path_applicable_imports( Qualifier::FirstSegmentUnresolved(first_segment, qualifier) => (first_segment, qualifier), }; - // TODO kb need to remove turbofish from the qualifier, maybe use the segments instead? - // TODO kb sorting is changed now, return back? + // TODO kb zz.syntax().ast_node() <- two options are now proposed despite the trait being imported let unresolved_qualifier_string = unresolved_qualifier.to_string(); let unresolved_first_segment_string = unresolved_first_segment.to_string(); @@ -525,12 +524,15 @@ fn path_import_candidate( Some(qualifier) => match sema.resolve_path(&qualifier) { None => { let qualifier_start = - qualifier.syntax().descendants().find_map(ast::PathSegment::cast)?; + qualifier.syntax().descendants().find_map(ast::NameRef::cast)?; let qualifier_start_path = qualifier_start.syntax().ancestors().find_map(ast::Path::cast)?; if sema.resolve_path(&qualifier_start_path).is_none() { ImportCandidate::Path(PathImportCandidate { - qualifier: Qualifier::FirstSegmentUnresolved(qualifier_start, qualifier), + qualifier: Qualifier::FirstSegmentUnresolved( + qualifier_start, + ModPath::from_src_unhygienic(qualifier)?, + ), name, }) } else { -- cgit v1.2.3