@@ -19,7 +19,7 @@ use Edit::*;
19
19
20
20
// Assist: merge_imports
21
21
//
22
- // Merges two imports with a common prefix.
22
+ // Merges neighbor imports with a common prefix.
23
23
//
24
24
// ```
25
25
// use std::$0fmt::Formatter;
@@ -32,37 +32,23 @@ use Edit::*;
32
32
pub ( crate ) fn merge_imports ( acc : & mut Assists , ctx : & AssistContext < ' _ > ) -> Option < ( ) > {
33
33
let ( target, edits) = if ctx. has_empty_selection ( ) {
34
34
// Merge a neighbor
35
- let tree: ast:: UseTree = ctx. find_node_at_offset ( ) ?;
36
- let mut target = tree. syntax ( ) . text_range ( ) ;
35
+ let mut tree: ast:: UseTree = ctx. find_node_at_offset ( ) ?;
36
+ if ctx. config . insert_use . granularity == ImportGranularity :: One
37
+ && tree. parent_use_tree_list ( ) . is_some ( )
38
+ {
39
+ cov_mark:: hit!( resolve_top_use_tree_for_import_one) ;
40
+ tree = tree. top_use_tree ( ) ;
41
+ }
42
+ let target = tree. syntax ( ) . text_range ( ) ;
37
43
38
44
let edits = if let Some ( use_item) = tree. syntax ( ) . parent ( ) . and_then ( ast:: Use :: cast) {
45
+ cov_mark:: hit!( merge_with_use_item_neighbors) ;
39
46
let mut neighbor = next_prev ( ) . find_map ( |dir| neighbor ( & use_item, dir) ) . into_iter ( ) ;
40
47
use_item. try_merge_from ( & mut neighbor, & ctx. config . insert_use )
41
48
} else {
49
+ cov_mark:: hit!( merge_with_use_tree_neighbors) ;
42
50
let mut neighbor = next_prev ( ) . find_map ( |dir| neighbor ( & tree, dir) ) . into_iter ( ) ;
43
- let mut edits = tree. clone ( ) . try_merge_from ( & mut neighbor, & ctx. config . insert_use ) ;
44
-
45
- if edits. is_none ( ) && ctx. config . insert_use . granularity == ImportGranularity :: One {
46
- let one_tree = tree
47
- . parent_use_tree_list ( )
48
- . map ( |it| it. parent_use_tree ( ) . top_use_tree ( ) )
49
- . filter ( |top_tree| top_tree. path ( ) . is_none ( ) )
50
- . and_then ( |one_tree| {
51
- one_tree. syntax ( ) . parent ( ) . and_then ( ast:: Use :: cast) . zip ( Some ( one_tree) )
52
- } ) ;
53
- if let Some ( ( use_item, one_tree) ) = one_tree {
54
- let mut neighbor = next_prev ( )
55
- . find_map ( |dir| syntax:: algo:: neighbor ( & use_item, dir) )
56
- . into_iter ( ) ;
57
- edits = use_item. try_merge_from ( & mut neighbor, & ctx. config . insert_use ) ;
58
-
59
- if edits. is_some ( ) {
60
- target = one_tree. syntax ( ) . text_range ( ) ;
61
- }
62
- }
63
- }
64
-
65
- edits
51
+ tree. clone ( ) . try_merge_from ( & mut neighbor, & ctx. config . insert_use )
66
52
} ;
67
53
( target, edits?)
68
54
} else {
@@ -79,9 +65,11 @@ pub(crate) fn merge_imports(acc: &mut Assists, ctx: &AssistContext<'_>) -> Optio
79
65
let edits = match_ast ! {
80
66
match first_selected {
81
67
ast:: Use ( use_item) => {
68
+ cov_mark:: hit!( merge_with_selected_use_item_neighbors) ;
82
69
use_item. try_merge_from( & mut selected_nodes. filter_map( ast:: Use :: cast) , & ctx. config. insert_use)
83
70
} ,
84
71
ast:: UseTree ( use_tree) => {
72
+ cov_mark:: hit!( merge_with_selected_use_tree_neighbors) ;
85
73
use_tree. try_merge_from( & mut selected_nodes. filter_map( ast:: UseTree :: cast) , & ctx. config. insert_use)
86
74
} ,
87
75
_ => return None ,
@@ -171,7 +159,10 @@ impl Edit {
171
159
172
160
#[ cfg( test) ]
173
161
mod tests {
174
- use crate :: tests:: { check_assist, check_assist_import_one, check_assist_not_applicable} ;
162
+ use crate :: tests:: {
163
+ check_assist, check_assist_import_one, check_assist_not_applicable,
164
+ check_assist_not_applicable_for_import_one,
165
+ } ;
175
166
176
167
use super :: * ;
177
168
@@ -202,6 +193,7 @@ mod tests {
202
193
203
194
#[ test]
204
195
fn test_merge_equal ( ) {
196
+ cov_mark:: check!( merge_with_use_item_neighbors) ;
205
197
check_assist (
206
198
merge_imports,
207
199
r"
@@ -212,6 +204,13 @@ use std::fmt::{Display, Debug};
212
204
use std::fmt::{Display, Debug};
213
205
" ,
214
206
) ;
207
+
208
+ // The assist macro below calls `check_assist_import_one` 4 times with different input
209
+ // use item variations based on the first 2 input parameters, but only 2 calls
210
+ // contain `use {std::fmt$0::{Display, Debug}};` for which the top use tree will need
211
+ // to be resolved.
212
+ cov_mark:: check_count!( resolve_top_use_tree_for_import_one, 2 ) ;
213
+ cov_mark:: check_count!( merge_with_use_item_neighbors, 4 ) ;
215
214
check_assist_import_one_variations ! (
216
215
"std::fmt$0::{Display, Debug}" ,
217
216
"std::fmt::{Display, Debug}" ,
@@ -287,14 +286,14 @@ use std::{fmt, $0fmt::Display};
287
286
use std::{fmt::{self, Display}};
288
287
" ,
289
288
) ;
290
- check_assist_import_one (
289
+ }
290
+
291
+ #[ test]
292
+ fn not_applicable_to_single_one_style_import ( ) {
293
+ cov_mark:: check!( resolve_top_use_tree_for_import_one) ;
294
+ check_assist_not_applicable_for_import_one (
291
295
merge_imports,
292
- r"
293
- use {std::{fmt, $0fmt::Display}};
294
- " ,
295
- r"
296
- use {std::{fmt::{self, Display}}};
297
- " ,
296
+ "use {std::{fmt, $0fmt::Display}};" ,
298
297
) ;
299
298
}
300
299
@@ -386,22 +385,14 @@ pub(in this::path) use std::fmt::{Debug, Display};
386
385
387
386
#[ test]
388
387
fn test_merge_nested ( ) {
388
+ cov_mark:: check!( merge_with_use_tree_neighbors) ;
389
389
check_assist (
390
390
merge_imports,
391
391
r"
392
392
use std::{fmt$0::Debug, fmt::Display};
393
393
" ,
394
394
r"
395
395
use std::{fmt::{Debug, Display}};
396
- " ,
397
- ) ;
398
- check_assist_import_one (
399
- merge_imports,
400
- r"
401
- use {std::{fmt$0::Debug, fmt::Display}};
402
- " ,
403
- r"
404
- use {std::{fmt::{Debug, Display}}};
405
396
" ,
406
397
) ;
407
398
}
@@ -415,15 +406,6 @@ use std::{fmt::Debug, fmt$0::Display};
415
406
" ,
416
407
r"
417
408
use std::{fmt::{Debug, Display}};
418
- " ,
419
- ) ;
420
- check_assist_import_one (
421
- merge_imports,
422
- r"
423
- use {std::{fmt::Debug, fmt$0::Display}};
424
- " ,
425
- r"
426
- use {std::{fmt::{Debug, Display}}};
427
409
" ,
428
410
) ;
429
411
}
@@ -475,15 +457,6 @@ use std::{fmt$0::{self, Debug}, fmt::{Write, Display}};
475
457
" ,
476
458
r"
477
459
use std::{fmt::{self, Debug, Display, Write}};
478
- " ,
479
- ) ;
480
- check_assist_import_one (
481
- merge_imports,
482
- r"
483
- use {std::{fmt$0::{self, Debug}, fmt::{Write, Display}}};
484
- " ,
485
- r"
486
- use {std::{fmt::{self, Debug, Display, Write}}};
487
460
" ,
488
461
) ;
489
462
}
@@ -682,6 +655,7 @@ use foo::{bar::Baz, *};
682
655
683
656
#[ test]
684
657
fn merge_selection_uses ( ) {
658
+ cov_mark:: check!( merge_with_selected_use_item_neighbors) ;
685
659
check_assist (
686
660
merge_imports,
687
661
r"
@@ -697,6 +671,8 @@ use std::fmt::{Debug, Display, Write};
697
671
use std::fmt::Result;
698
672
" ,
699
673
) ;
674
+
675
+ cov_mark:: check!( merge_with_selected_use_item_neighbors) ;
700
676
check_assist_import_one (
701
677
merge_imports,
702
678
r"
@@ -716,6 +692,7 @@ use std::fmt::Result;
716
692
717
693
#[ test]
718
694
fn merge_selection_use_trees ( ) {
695
+ cov_mark:: check!( merge_with_selected_use_tree_neighbors) ;
719
696
check_assist (
720
697
merge_imports,
721
698
r"
@@ -733,7 +710,9 @@ use std::{
733
710
fmt::Result,
734
711
};" ,
735
712
) ;
713
+
736
714
// FIXME: Remove redundant braces. See also unnecessary-braces diagnostic.
715
+ cov_mark:: check!( merge_with_selected_use_tree_neighbors) ;
737
716
check_assist (
738
717
merge_imports,
739
718
r"use std::$0{fmt::Display, fmt::Debug}$0;" ,
0 commit comments