]> git.lizzy.rs Git - rust.git/commitdiff
Properly handle turbofishes in qualifiers
authorKirill Bulatov <mail4score@gmail.com>
Sun, 28 Feb 2021 07:57:54 +0000 (09:57 +0200)
committerKirill Bulatov <mail4score@gmail.com>
Mon, 8 Mar 2021 21:59:20 +0000 (23:59 +0200)
crates/hir_def/src/path.rs
crates/ide_assists/src/handlers/auto_import.rs
crates/ide_assists/src/handlers/qualify_path.rs
crates/ide_completion/src/completions/flyimport.rs
crates/ide_db/src/helpers/import_assets.rs

index 0e60dc2b63a05f3a0ec9d83e111fdc291c40e7c2..1dc085199f37f1807ebee83e3b1c1354bec68526 100644 (file)
@@ -44,6 +44,10 @@ pub enum ImportAlias {
 }
 
 impl ModPath {
+    pub fn from_src_unhygienic(path: ast::Path) -> Option<ModPath> {
+        lower::lower_path(path, &Hygiene::new_unhygienic()).map(|it| it.mod_path)
+    }
+
     pub fn from_src(path: ast::Path, hygiene: &Hygiene) -> Option<ModPath> {
         lower::lower_path(path, hygiene).map(|it| it.mod_path)
     }
index 7188724be78c3e5a34d947314fd399b5b87dcd47..e9993a7cc9f9f28208566888df1b423ebc46cca4 100644 (file)
@@ -242,7 +242,7 @@ pub mod PubMod3 {
             }
             ",
             r"
-            use PubMod3::PubStruct;
+            use PubMod1::PubStruct;
 
             PubStruct
 
index a40cdd80e03c461eab231fba85582b05e3ba11d0..261178448641ceef204f9a3e7bc592e682a0a1d1 100644 (file)
@@ -313,7 +313,7 @@ pub mod PubMod3 {
             }
             ",
             r"
-            PubMod3::PubStruct
+            PubMod1::PubStruct
 
             pub mod PubMod1 {
                 pub struct PubStruct;
index e33fc4b78addd6184c4f8cdf41f9765d6b1e689c..af49fdd2626db19f73b8aed81105e26dec50b079 100644 (file)
@@ -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
             "#]],
         );
     }
index 3d79f97711c694406d11a3108bd803d432b31796..2e7a183d1c3ca0db82408f6f313a603734eba3f1 100644 (file)
@@ -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 {