diff options
Diffstat (limited to 'crates/assists/src/handlers/auto_import.rs')
-rw-r--r-- | crates/assists/src/handlers/auto_import.rs | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/crates/assists/src/handlers/auto_import.rs b/crates/assists/src/handlers/auto_import.rs index c4770f336..66e819154 100644 --- a/crates/assists/src/handlers/auto_import.rs +++ b/crates/assists/src/handlers/auto_import.rs | |||
@@ -1,11 +1,13 @@ | |||
1 | use std::collections::BTreeSet; | 1 | use std::collections::BTreeSet; |
2 | 2 | ||
3 | use ast::make; | ||
3 | use either::Either; | 4 | use either::Either; |
4 | use hir::{ | 5 | use hir::{ |
5 | AsAssocItem, AssocItemContainer, ModPath, Module, ModuleDef, PathResolution, Semantics, Trait, | 6 | AsAssocItem, AssocItemContainer, ModPath, Module, ModuleDef, PathResolution, Semantics, Trait, |
6 | Type, | 7 | Type, |
7 | }; | 8 | }; |
8 | use ide_db::{imports_locator, RootDatabase}; | 9 | use ide_db::{imports_locator, RootDatabase}; |
10 | use insert_use::ImportScope; | ||
9 | use rustc_hash::FxHashSet; | 11 | use rustc_hash::FxHashSet; |
10 | use syntax::{ | 12 | use syntax::{ |
11 | ast::{self, AstNode}, | 13 | ast::{self, AstNode}, |
@@ -13,7 +15,8 @@ use syntax::{ | |||
13 | }; | 15 | }; |
14 | 16 | ||
15 | use crate::{ | 17 | use crate::{ |
16 | utils::insert_use_statement, AssistContext, AssistId, AssistKind, Assists, GroupLabel, | 18 | utils::{insert_use, MergeBehaviour}, |
19 | AssistContext, AssistId, AssistKind, Assists, GroupLabel, | ||
17 | }; | 20 | }; |
18 | 21 | ||
19 | // Assist: auto_import | 22 | // Assist: auto_import |
@@ -44,6 +47,9 @@ pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext) -> Option<()> | |||
44 | 47 | ||
45 | let range = ctx.sema.original_range(&auto_import_assets.syntax_under_caret).range; | 48 | let range = ctx.sema.original_range(&auto_import_assets.syntax_under_caret).range; |
46 | let group = auto_import_assets.get_import_group_message(); | 49 | let group = auto_import_assets.get_import_group_message(); |
50 | let scope = | ||
51 | ImportScope::find_insert_use_container(&auto_import_assets.syntax_under_caret, ctx)?; | ||
52 | let syntax = scope.as_syntax_node(); | ||
47 | for import in proposed_imports { | 53 | for import in proposed_imports { |
48 | acc.add_group( | 54 | acc.add_group( |
49 | &group, | 55 | &group, |
@@ -51,12 +57,12 @@ pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext) -> Option<()> | |||
51 | format!("Import `{}`", &import), | 57 | format!("Import `{}`", &import), |
52 | range, | 58 | range, |
53 | |builder| { | 59 | |builder| { |
54 | insert_use_statement( | 60 | let new_syntax = insert_use( |
55 | &auto_import_assets.syntax_under_caret, | 61 | &scope, |
56 | &import.to_string(), | 62 | make::path_from_text(&import.to_string()), |
57 | ctx, | 63 | Some(MergeBehaviour::Full), |
58 | builder.text_edit_builder(), | ||
59 | ); | 64 | ); |
65 | builder.replace(syntax.text_range(), new_syntax.to_string()) | ||
60 | }, | 66 | }, |
61 | ); | 67 | ); |
62 | } | 68 | } |
@@ -358,7 +364,7 @@ mod tests { | |||
358 | } | 364 | } |
359 | ", | 365 | ", |
360 | r" | 366 | r" |
361 | use PubMod::{PubStruct2, PubStruct1}; | 367 | use PubMod::{PubStruct1, PubStruct2}; |
362 | 368 | ||
363 | struct Test { | 369 | struct Test { |
364 | test: PubStruct2<u8>, | 370 | test: PubStruct2<u8>, |