aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/assists/auto_import.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/assists/auto_import.rs')
-rw-r--r--crates/ra_assists/src/assists/auto_import.rs39
1 files changed, 14 insertions, 25 deletions
diff --git a/crates/ra_assists/src/assists/auto_import.rs b/crates/ra_assists/src/assists/auto_import.rs
index 48ab336b1..219051063 100644
--- a/crates/ra_assists/src/assists/auto_import.rs
+++ b/crates/ra_assists/src/assists/auto_import.rs
@@ -6,8 +6,9 @@ use ra_syntax::{
6 6
7use crate::{ 7use crate::{
8 assist_ctx::{ActionBuilder, Assist, AssistCtx}, 8 assist_ctx::{ActionBuilder, Assist, AssistCtx},
9 auto_import_text_edit, AssistId, ImportsLocator, 9 auto_import_text_edit, AssistId,
10}; 10};
11use ra_ide_db::imports_locator::ImportsLocatorIde;
11 12
12// Assist: auto_import 13// Assist: auto_import
13// 14//
@@ -26,10 +27,7 @@ use crate::{
26// let map = HashMap<|>::new(); 27// let map = HashMap<|>::new();
27// } 28// }
28// ``` 29// ```
29pub(crate) fn auto_import<F: ImportsLocator>( 30pub(crate) fn auto_import(ctx: AssistCtx) -> Option<Assist> {
30 ctx: AssistCtx,
31 imports_locator: &mut F,
32) -> Option<Assist> {
33 let path_to_import: ast::Path = ctx.find_node_at_offset()?; 31 let path_to_import: ast::Path = ctx.find_node_at_offset()?;
34 let path_to_import_syntax = path_to_import.syntax(); 32 let path_to_import_syntax = path_to_import.syntax();
35 if path_to_import_syntax.ancestors().find_map(ast::UseItem::cast).is_some() { 33 if path_to_import_syntax.ancestors().find_map(ast::UseItem::cast).is_some() {
@@ -52,6 +50,8 @@ pub(crate) fn auto_import<F: ImportsLocator>(
52 return None; 50 return None;
53 } 51 }
54 52
53 let mut imports_locator = ImportsLocatorIde::new(ctx.db);
54
55 let proposed_imports = imports_locator 55 let proposed_imports = imports_locator
56 .find_imports(&name_to_import) 56 .find_imports(&name_to_import)
57 .into_iter() 57 .into_iter()
@@ -81,16 +81,12 @@ fn import_to_action(import: ModPath, position: &SyntaxNode, anchor: &SyntaxNode)
81#[cfg(test)] 81#[cfg(test)]
82mod tests { 82mod tests {
83 use super::*; 83 use super::*;
84 use crate::helpers::{ 84 use crate::helpers::{check_assist, check_assist_not_applicable};
85 check_assist_with_imports_locator, check_assist_with_imports_locator_not_applicable,
86 TestImportsLocator,
87 };
88 85
89 #[test] 86 #[test]
90 fn applicable_when_found_an_import() { 87 fn applicable_when_found_an_import() {
91 check_assist_with_imports_locator( 88 check_assist(
92 auto_import, 89 auto_import,
93 TestImportsLocator::new,
94 r" 90 r"
95 <|>PubStruct 91 <|>PubStruct
96 92
@@ -112,9 +108,8 @@ mod tests {
112 108
113 #[test] 109 #[test]
114 fn auto_imports_are_merged() { 110 fn auto_imports_are_merged() {
115 check_assist_with_imports_locator( 111 check_assist(
116 auto_import, 112 auto_import,
117 TestImportsLocator::new,
118 r" 113 r"
119 use PubMod::PubStruct1; 114 use PubMod::PubStruct1;
120 115
@@ -148,9 +143,8 @@ mod tests {
148 143
149 #[test] 144 #[test]
150 fn applicable_when_found_multiple_imports() { 145 fn applicable_when_found_multiple_imports() {
151 check_assist_with_imports_locator( 146 check_assist(
152 auto_import, 147 auto_import,
153 TestImportsLocator::new,
154 r" 148 r"
155 PubSt<|>ruct 149 PubSt<|>ruct
156 150
@@ -184,9 +178,8 @@ mod tests {
184 178
185 #[test] 179 #[test]
186 fn not_applicable_for_already_imported_types() { 180 fn not_applicable_for_already_imported_types() {
187 check_assist_with_imports_locator_not_applicable( 181 check_assist_not_applicable(
188 auto_import, 182 auto_import,
189 TestImportsLocator::new,
190 r" 183 r"
191 use PubMod::PubStruct; 184 use PubMod::PubStruct;
192 185
@@ -201,9 +194,8 @@ mod tests {
201 194
202 #[test] 195 #[test]
203 fn not_applicable_for_types_with_private_paths() { 196 fn not_applicable_for_types_with_private_paths() {
204 check_assist_with_imports_locator_not_applicable( 197 check_assist_not_applicable(
205 auto_import, 198 auto_import,
206 TestImportsLocator::new,
207 r" 199 r"
208 PrivateStruct<|> 200 PrivateStruct<|>
209 201
@@ -216,9 +208,8 @@ mod tests {
216 208
217 #[test] 209 #[test]
218 fn not_applicable_when_no_imports_found() { 210 fn not_applicable_when_no_imports_found() {
219 check_assist_with_imports_locator_not_applicable( 211 check_assist_not_applicable(
220 auto_import, 212 auto_import,
221 TestImportsLocator::new,
222 " 213 "
223 PubStruct<|>", 214 PubStruct<|>",
224 ); 215 );
@@ -226,9 +217,8 @@ mod tests {
226 217
227 #[test] 218 #[test]
228 fn not_applicable_in_import_statements() { 219 fn not_applicable_in_import_statements() {
229 check_assist_with_imports_locator_not_applicable( 220 check_assist_not_applicable(
230 auto_import, 221 auto_import,
231 TestImportsLocator::new,
232 r" 222 r"
233 use PubStruct<|>; 223 use PubStruct<|>;
234 224
@@ -240,9 +230,8 @@ mod tests {
240 230
241 #[test] 231 #[test]
242 fn function_import() { 232 fn function_import() {
243 check_assist_with_imports_locator( 233 check_assist(
244 auto_import, 234 auto_import,
245 TestImportsLocator::new,
246 r" 235 r"
247 test_function<|> 236 test_function<|>
248 237