@@ -244,7 +244,7 @@ fn rename_mod(
244244
245245fn rename_reference (
246246 sema : & Semantics < RootDatabase > ,
247- mut def : Definition ,
247+ def : Definition ,
248248 new_name : & str ,
249249) -> Result < SourceChange > {
250250 let ident_kind = IdentifierKind :: classify ( new_name) ?;
@@ -271,15 +271,43 @@ fn rename_reference(
271271 }
272272 }
273273
274+ let def = convert_to_trait_def ( def, sema) ;
275+ let usages = def. usages ( sema) . all ( ) ;
276+
277+ if !usages. is_empty ( ) && ident_kind == IdentifierKind :: Underscore {
278+ cov_mark:: hit!( rename_underscore_multiple) ;
279+ bail ! ( "Cannot rename reference to `_` as it is being referenced multiple times" ) ;
280+ }
281+ let mut source_change = SourceChange :: default ( ) ;
282+ source_change. extend ( usages. iter ( ) . map ( |( & file_id, references) | {
283+ ( file_id, source_edit_from_references ( references, def, new_name) )
284+ } ) ) ;
285+
286+ let mut insert_def_edit = |def| {
287+ let ( file_id, edit) = source_edit_from_def ( sema, def, new_name) ?;
288+ source_change. insert_source_edit ( file_id, edit) ;
289+ Ok ( ( ) )
290+ } ;
291+ match def {
292+ Definition :: Local ( l) => l
293+ . associated_locals ( sema. db )
294+ . iter ( )
295+ . try_for_each ( |& local| insert_def_edit ( Definition :: Local ( local) ) ) ,
296+ def => insert_def_edit ( def) ,
297+ } ?;
298+ Ok ( source_change)
299+ }
300+
301+ pub ( crate ) fn convert_to_trait_def ( def : Definition , sema : & Semantics < RootDatabase > ) -> Definition {
302+ // HACK: resolve trait impl items to the item def of the trait definition
303+ // so that we properly resolve all trait item references
274304 let assoc_item = match def {
275- // HACK: resolve trait impl items to the item def of the trait definition
276- // so that we properly resolve all trait item references
277305 Definition :: Function ( it) => it. as_assoc_item ( sema. db ) ,
278306 Definition :: TypeAlias ( it) => it. as_assoc_item ( sema. db ) ,
279307 Definition :: Const ( it) => it. as_assoc_item ( sema. db ) ,
280308 _ => None ,
281309 } ;
282- def = match assoc_item {
310+ match assoc_item {
283311 Some ( assoc) => assoc
284312 . containing_trait_impl ( sema. db )
285313 . and_then ( |trait_| {
@@ -305,31 +333,7 @@ fn rename_reference(
305333 } )
306334 . unwrap_or ( def) ,
307335 None => def,
308- } ;
309- let usages = def. usages ( sema) . all ( ) ;
310-
311- if !usages. is_empty ( ) && ident_kind == IdentifierKind :: Underscore {
312- cov_mark:: hit!( rename_underscore_multiple) ;
313- bail ! ( "Cannot rename reference to `_` as it is being referenced multiple times" ) ;
314336 }
315- let mut source_change = SourceChange :: default ( ) ;
316- source_change. extend ( usages. iter ( ) . map ( |( & file_id, references) | {
317- ( file_id, source_edit_from_references ( references, def, new_name) )
318- } ) ) ;
319-
320- let mut insert_def_edit = |def| {
321- let ( file_id, edit) = source_edit_from_def ( sema, def, new_name) ?;
322- source_change. insert_source_edit ( file_id, edit) ;
323- Ok ( ( ) )
324- } ;
325- match def {
326- Definition :: Local ( l) => l
327- . associated_locals ( sema. db )
328- . iter ( )
329- . try_for_each ( |& local| insert_def_edit ( Definition :: Local ( local) ) ) ,
330- def => insert_def_edit ( def) ,
331- } ?;
332- Ok ( source_change)
333337}
334338
335339pub fn source_edit_from_references (
0 commit comments