@@ -7,6 +7,7 @@ use ide_db::{
7
7
imports:: insert_use:: remove_path_if_in_use_stmt,
8
8
path_transform:: PathTransform ,
9
9
search:: { FileReference , SearchScope } ,
10
+ source_change:: SourceChangeBuilder ,
10
11
syntax_helpers:: { insert_whitespace_into_node:: insert_ws_into, node_ext:: expr_as_name_ref} ,
11
12
RootDatabase ,
12
13
} ;
@@ -100,18 +101,7 @@ pub(crate) fn inline_into_callers(acc: &mut Assists, ctx: &AssistContext<'_>) ->
100
101
builder. edit_file ( file_id) ;
101
102
let count = refs. len ( ) ;
102
103
// The collects are required as we are otherwise iterating while mutating 🙅♀️🙅♂️
103
- let ( name_refs, name_refs_use) : ( Vec < _ > , Vec < _ > ) = refs
104
- . into_iter ( )
105
- . filter_map ( |file_ref| match file_ref. name {
106
- ast:: NameLike :: NameRef ( name_ref) => Some ( name_ref) ,
107
- _ => None ,
108
- } )
109
- . partition_map ( |name_ref| {
110
- match name_ref. syntax ( ) . ancestors ( ) . find_map ( ast:: UseTree :: cast) {
111
- Some ( use_tree) => Either :: Right ( builder. make_mut ( use_tree) ) ,
112
- None => Either :: Left ( name_ref) ,
113
- }
114
- } ) ;
104
+ let ( name_refs, name_refs_use) = split_refs_and_uses ( builder, refs, Some ) ;
115
105
let call_infos: Vec < _ > = name_refs
116
106
. into_iter ( )
117
107
. filter_map ( CallInfo :: from_name_ref)
@@ -130,11 +120,7 @@ pub(crate) fn inline_into_callers(acc: &mut Assists, ctx: &AssistContext<'_>) ->
130
120
. count ( ) ;
131
121
if replaced + name_refs_use. len ( ) == count {
132
122
// we replaced all usages in this file, so we can remove the imports
133
- name_refs_use. into_iter ( ) . for_each ( |use_tree| {
134
- if let Some ( path) = use_tree. path ( ) {
135
- remove_path_if_in_use_stmt ( & path) ;
136
- }
137
- } )
123
+ name_refs_use. iter ( ) . for_each ( remove_path_if_in_use_stmt) ;
138
124
} else {
139
125
remove_def = false ;
140
126
}
@@ -153,6 +139,23 @@ pub(crate) fn inline_into_callers(acc: &mut Assists, ctx: &AssistContext<'_>) ->
153
139
)
154
140
}
155
141
142
+ pub ( super ) fn split_refs_and_uses < T : ast:: AstNode > (
143
+ builder : & mut SourceChangeBuilder ,
144
+ iter : impl IntoIterator < Item = FileReference > ,
145
+ mut map_ref : impl FnMut ( ast:: NameRef ) -> Option < T > ,
146
+ ) -> ( Vec < T > , Vec < ast:: Path > ) {
147
+ iter. into_iter ( )
148
+ . filter_map ( |file_ref| match file_ref. name {
149
+ ast:: NameLike :: NameRef ( name_ref) => Some ( name_ref) ,
150
+ _ => None ,
151
+ } )
152
+ . filter_map ( |name_ref| match name_ref. syntax ( ) . ancestors ( ) . find_map ( ast:: UseTree :: cast) {
153
+ Some ( use_tree) => builder. make_mut ( use_tree) . path ( ) . map ( Either :: Right ) ,
154
+ None => map_ref ( name_ref) . map ( Either :: Left ) ,
155
+ } )
156
+ . partition_map ( |either| either)
157
+ }
158
+
156
159
// Assist: inline_call
157
160
//
158
161
// Inlines a function or method body creating a `let` statement per parameter unless the parameter
0 commit comments