11use ide_db:: { famous_defs:: FamousDefs , traits:: resolve_target_trait} ;
22use syntax:: {
3- AstNode ,
3+ AstNode , T ,
44 ast:: { self , edit_in_place:: Indent , make} ,
55 ted,
66} ;
@@ -32,7 +32,7 @@ use crate::{AssistContext, AssistId, Assists};
3232//
3333// $0impl<T> core::ops::IndexMut<Axis> for [T; 3] {
3434// fn index_mut(&mut self, index: Axis) -> &mut Self::Output {
35- // &self[index as usize]
35+ // &mut self[index as usize]
3636// }
3737// }
3838//
@@ -92,6 +92,7 @@ pub(crate) fn generate_mut_trait_impl(acc: &mut Assists, ctx: &AssistContext<'_>
9292 ast:: AssocItem :: Fn ( f) => Some ( f) ,
9393 _ => None ,
9494 } ) ?;
95+ let _ = process_ref_mut ( & fn_) ;
9596
9697 let assoc_list = make:: assoc_item_list ( ) . clone_for_update ( ) ;
9798 ted:: replace ( impl_def. assoc_item_list ( ) ?. syntax ( ) , assoc_list. syntax ( ) ) ;
@@ -108,6 +109,20 @@ pub(crate) fn generate_mut_trait_impl(acc: &mut Assists, ctx: &AssistContext<'_>
108109 )
109110}
110111
112+ fn process_ref_mut ( fn_ : & ast:: Fn ) -> Option < ( ) > {
113+ let expr = fn_. body ( ) ?. tail_expr ( ) ?;
114+ match & expr {
115+ ast:: Expr :: RefExpr ( ref_expr) if ref_expr. mut_token ( ) . is_none ( ) => {
116+ ted:: insert_all_raw (
117+ ted:: Position :: after ( ref_expr. amp_token ( ) ?) ,
118+ vec ! [ make:: token( T ![ mut ] ) . into( ) , make:: tokens:: whitespace( " " ) . into( ) ] ,
119+ ) ;
120+ }
121+ _ => { }
122+ }
123+ None
124+ }
125+
111126fn get_trait_mut ( apply_trait : & hir:: Trait , famous : FamousDefs < ' _ , ' _ > ) -> Option < & ' static str > {
112127 let trait_ = Some ( apply_trait) ;
113128 if trait_ == famous. core_convert_Index ( ) . as_ref ( ) {
@@ -167,7 +182,7 @@ pub enum Axis { X = 0, Y = 1, Z = 2 }
167182
168183$0impl<T> core::ops::IndexMut<Axis> for [T; 3] {
169184 fn index_mut(&mut self, index: Axis) -> &mut Self::Output {
170- &self[index as usize]
185+ &mut self[index as usize]
171186 }
172187}
173188
@@ -234,7 +249,7 @@ struct Foo(i32);
234249
235250$0impl core::convert::AsMut<i32> for Foo {
236251 fn as_mut(&mut self) -> &mut i32 {
237- &self.0
252+ &mut self.0
238253 }
239254}
240255
0 commit comments