aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_assists/src/assists/auto_import.rs22
1 files changed, 16 insertions, 6 deletions
diff --git a/crates/ra_assists/src/assists/auto_import.rs b/crates/ra_assists/src/assists/auto_import.rs
index 2629f00e6..7fd1f0e7d 100644
--- a/crates/ra_assists/src/assists/auto_import.rs
+++ b/crates/ra_assists/src/assists/auto_import.rs
@@ -1,7 +1,7 @@
1use hir::{db::HirDatabase, ModPath}; 1use hir::{db::HirDatabase, ModPath};
2use ra_syntax::{ 2use ra_syntax::{
3 ast::{self, AstNode}, 3 ast::{self, AstNode},
4 SyntaxKind::USE_ITEM, 4 SyntaxKind::{NAME_REF, USE_ITEM},
5 SyntaxNode, 5 SyntaxNode,
6}; 6};
7 7
@@ -36,6 +36,8 @@ pub(crate) fn auto_import<F: ImportsLocator>(
36 if path_to_import_syntax.ancestors().find(|ancestor| ancestor.kind() == USE_ITEM).is_some() { 36 if path_to_import_syntax.ancestors().find(|ancestor| ancestor.kind() == USE_ITEM).is_some() {
37 return None; 37 return None;
38 } 38 }
39 let name_to_import =
40 path_to_import_syntax.descendants().find(|child| child.kind() == NAME_REF)?;
39 41
40 let module = path_to_import_syntax.ancestors().find_map(ast::Module::cast); 42 let module = path_to_import_syntax.ancestors().find_map(ast::Module::cast);
41 let position = match module.and_then(|it| it.item_list()) { 43 let position = match module.and_then(|it| it.item_list()) {
@@ -52,7 +54,7 @@ pub(crate) fn auto_import<F: ImportsLocator>(
52 } 54 }
53 55
54 let proposed_imports = imports_locator 56 let proposed_imports = imports_locator
55 .find_imports(&path_to_import_syntax.to_string()) 57 .find_imports(&name_to_import.to_string())
56 .into_iter() 58 .into_iter()
57 .filter_map(|module_def| module_with_name_to_import.find_use_path(ctx.db, module_def)) 59 .filter_map(|module_def| module_with_name_to_import.find_use_path(ctx.db, module_def))
58 .filter(|use_path| !use_path.segments.is_empty()) 60 .filter(|use_path| !use_path.segments.is_empty())
@@ -121,21 +123,29 @@ mod tests {
121 r" 123 r"
122 use PubMod::PubStruct1; 124 use PubMod::PubStruct1;
123 125
124 PubStruct2<|> 126 struct Test {
127 test: Pub<|>Struct2<u8>,
128 }
125 129
126 pub mod PubMod { 130 pub mod PubMod {
127 pub struct PubStruct1; 131 pub struct PubStruct1;
128 pub struct PubStruct2; 132 pub struct PubStruct2<T> {
133 _t: T,
134 }
129 } 135 }
130 ", 136 ",
131 r" 137 r"
132 use PubMod::{PubStruct2, PubStruct1}; 138 use PubMod::{PubStruct2, PubStruct1};
133 139
134 PubStruct2<|> 140 struct Test {
141 test: Pub<|>Struct2<u8>,
142 }
135 143
136 pub mod PubMod { 144 pub mod PubMod {
137 pub struct PubStruct1; 145 pub struct PubStruct1;
138 pub struct PubStruct2; 146 pub struct PubStruct2<T> {
147 _t: T,
148 }
139 } 149 }
140 ", 150 ",
141 ); 151 );