3
3
// - Remove unused aliases if there are no longer any users, see inline_call.rs.
4
4
5
5
use hir:: { HasSource , PathResolution } ;
6
- use ide_db:: { defs:: Definition , search:: FileReference } ;
6
+ use ide_db:: {
7
+ defs:: Definition , imports:: insert_use:: ast_to_remove_for_path_in_use_stmt,
8
+ search:: FileReference ,
9
+ } ;
7
10
use itertools:: Itertools ;
8
11
use std:: collections:: HashMap ;
9
12
use syntax:: {
@@ -16,6 +19,8 @@ use crate::{
16
19
AssistId , AssistKind ,
17
20
} ;
18
21
22
+ use super :: inline_call:: split_refs_and_uses;
23
+
19
24
// Assist: inline_type_alias_uses
20
25
//
21
26
// Inline a type alias into all of its uses where possible.
@@ -31,7 +36,7 @@ use crate::{
31
36
// ```
32
37
// ->
33
38
// ```
34
- // type A = i32;
39
+ //
35
40
// fn id(x: i32) -> i32 {
36
41
// x
37
42
// };
@@ -58,32 +63,41 @@ pub(crate) fn inline_type_alias_uses(acc: &mut Assists, ctx: &AssistContext<'_>)
58
63
name. syntax ( ) . text_range ( ) ,
59
64
|builder| {
60
65
let usages = usages. all ( ) ;
66
+ let mut definition_deleted = false ;
61
67
62
68
let mut inline_refs_for_file = |file_id, refs : Vec < FileReference > | {
63
69
builder. edit_file ( file_id) ;
64
70
65
- let path_types: Vec < ast:: PathType > = refs
66
- . into_iter ( )
67
- . filter_map ( |file_ref| match file_ref. name {
68
- ast:: NameLike :: NameRef ( path_type) => {
69
- path_type. syntax ( ) . ancestors ( ) . nth ( 3 ) . and_then ( ast:: PathType :: cast)
70
- }
71
- _ => None ,
72
- } )
73
- . collect ( ) ;
71
+ let ( path_types, path_type_uses) =
72
+ split_refs_and_uses ( builder, refs, |path_type| {
73
+ path_type. syntax ( ) . ancestors ( ) . nth ( 3 ) . and_then ( ast:: PathType :: cast)
74
+ } ) ;
74
75
76
+ path_type_uses
77
+ . iter ( )
78
+ . flat_map ( ast_to_remove_for_path_in_use_stmt)
79
+ . for_each ( |x| builder. delete ( x. syntax ( ) . text_range ( ) ) ) ;
75
80
for ( target, replacement) in path_types. into_iter ( ) . filter_map ( |path_type| {
76
81
let replacement = inline ( & ast_alias, & path_type) ?. to_text ( & concrete_type) ;
77
82
let target = path_type. syntax ( ) . text_range ( ) ;
78
83
Some ( ( target, replacement) )
79
84
} ) {
80
85
builder. replace ( target, replacement) ;
81
86
}
87
+
88
+ if file_id == ctx. file_id ( ) {
89
+ builder. delete ( ast_alias. syntax ( ) . text_range ( ) ) ;
90
+ definition_deleted = true ;
91
+ }
82
92
} ;
83
93
84
94
for ( file_id, refs) in usages. into_iter ( ) {
85
95
inline_refs_for_file ( file_id, refs) ;
86
96
}
97
+ if !definition_deleted {
98
+ builder. edit_file ( ctx. file_id ( ) ) ;
99
+ builder. delete ( ast_alias. syntax ( ) . text_range ( ) ) ;
100
+ }
87
101
} ,
88
102
)
89
103
}
@@ -929,7 +943,7 @@ fn foo() {
929
943
}
930
944
"# ,
931
945
r#"
932
- type A = u32;
946
+
933
947
934
948
fn foo() {
935
949
let _: u32 = 3;
@@ -960,13 +974,13 @@ fn foo() {
960
974
r#"
961
975
//- /lib.rs
962
976
mod foo;
963
- type T<E> = Vec<E>;
977
+
964
978
fn f() -> Vec<&str> {
965
979
vec!["hello"]
966
980
}
967
981
968
982
//- /foo.rs
969
- use super::T;
983
+
970
984
fn foo() {
971
985
let _: Vec<i8> = Vec::new();
972
986
}
@@ -990,7 +1004,12 @@ fn foo() {
990
1004
}
991
1005
"# ,
992
1006
r#"
993
- use super::I;
1007
+ //- /lib.rs
1008
+ mod foo;
1009
+
1010
+
1011
+ //- /foo.rs
1012
+
994
1013
fn foo() {
995
1014
let _: i32 = 0;
996
1015
}
0 commit comments