@@ -249,6 +249,26 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
249249        None 
250250    } 
251251
252+     fn  is_hir_id_from_struct_pattern_shorthand_field ( & self ,  hir_id :  hir:: HirId )  -> bool  { 
253+         let  parent_id = self . tcx . hir ( ) . get_parent_node_by_hir_id ( expr. hir_id ) ; 
254+         let  mut  is_struct_pat_shorthand_field = false ; 
255+         if  let  Some ( parent)  = self . tcx . hir ( ) . find_by_hir_id ( parent_id)  { 
256+             // Account for fields 
257+             if  let  Node :: Expr ( hir:: Expr  { 
258+                 node :  hir:: ExprKind :: Struct ( _,  fields,  ..) ,  ..
259+             } )  = parent { 
260+                 if  let  Ok ( src)  = cm. span_to_snippet ( sp)  { 
261+                     for  field in  fields { 
262+                         if  field. ident . as_str ( )  == src. as_str ( )  && field. is_shorthand  { 
263+                             is_struct_pat_shorthand_field = true ; 
264+                             break ; 
265+                         } 
266+                     } 
267+                 } 
268+             } 
269+         } ; 
270+     } 
271+ 
252272    /// This function is used to determine potential "simple" improvements or users' errors and 
253273/// provide them useful help. For example: 
254274/// 
@@ -277,23 +297,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
277297            return  None ; 
278298        } 
279299
280-         let  parent_id = self . tcx . hir ( ) . get_parent_node_by_hir_id ( expr. hir_id ) ; 
281-         let  mut  is_struct_pat_shorthand_field = false ; 
282-         if  let  Some ( parent)  = self . tcx . hir ( ) . find_by_hir_id ( parent_id)  { 
283-             // Account for fields 
284-             if  let  Node :: Expr ( hir:: Expr  { 
285-                 node :  hir:: ExprKind :: Struct ( _,  fields,  ..) ,  ..
286-             } )  = parent { 
287-                 if  let  Ok ( src)  = cm. span_to_snippet ( sp)  { 
288-                     for  field in  fields { 
289-                         if  field. ident . as_str ( )  == src. as_str ( )  && field. is_shorthand  { 
290-                             is_struct_pat_shorthand_field = true ; 
291-                             break ; 
292-                         } 
293-                     } 
294-                 } 
295-             } 
296-         } ; 
300+         let  mut  is_struct_pat_shorthand_field =
301+             self . is_hir_id_from_struct_pattern_shorthand_field ( expr. hir_id ) ; 
297302
298303        match  ( & expected. sty ,  & checked_ty. sty )  { 
299304            ( & ty:: Ref ( _,  exp,  _) ,  & ty:: Ref ( _,  check,  _) )  => match  ( & exp. sty ,  & check. sty )  { 
@@ -333,12 +338,12 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
333338                // bar(&x); // error, expected &mut 
334339                // ``` 
335340                let  ref_ty = match  mutability { 
336-                     hir:: Mutability :: MutMutable  => self . tcx . mk_mut_ref ( 
337-                                                         self . tcx . mk_region ( ty:: ReStatic ) , 
338-                                                        checked_ty ) , 
339-                     hir:: Mutability :: MutImmutable  => self . tcx . mk_imm_ref ( 
340-                                                         self . tcx . mk_region ( ty:: ReStatic ) , 
341-                                                        checked_ty ) , 
341+                     hir:: Mutability :: MutMutable  => { 
342+                         self . tcx . mk_mut_ref ( self . tcx . mk_region ( ty:: ReStatic ) ,  checked_ty ) 
343+                     } 
344+                     hir:: Mutability :: MutImmutable  => { 
345+                         self . tcx . mk_imm_ref ( self . tcx . mk_region ( ty:: ReStatic ) ,  checked_ty ) 
346+                     } 
342347                } ; 
343348                if  self . can_coerce ( ref_ty,  expected)  { 
344349                    if  let  Ok ( src)  = cm. span_to_snippet ( sp)  { 
@@ -359,22 +364,22 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
359364                        if  let  Some ( sugg)  = self . can_use_as_ref ( expr)  { 
360365                            return  Some ( sugg) ; 
361366                        } 
362-                         return   Some ( match   ( mutability ,   is_struct_pat_shorthand_field)  { 
363-                             ( hir :: Mutability :: MutMutable ,   false )  =>  { 
364-                                  ( sp ,   "consider mutably borrowing here" , 
365-                                   format ! ( "&mut {}" ,  sugg_expr ) ) 
366-                              } 
367-                              ( hir :: Mutability :: MutImmutable ,   false )  =>  { 
368-                                  ( sp ,   "consider borrowing here" ,   format ! ( "&{}" ,  sugg_expr ) ) 
369-                             } 
370-                             ( hir :: Mutability :: MutMutable ,   true )  =>  { 
371-                                 ( sp ,   "consider mutably borrowing here" , 
372-                                   format ! ( "{}: &mut {}" ,  sugg_expr ,  sugg_expr ) ) 
373-                             } 
374-                             ( hir :: Mutability :: MutImmutable ,   true )  =>  { 
375-                                 ( sp ,   "consider borrowing here" , 
376-                                   format ! ( "{}:  &{}" ,  sugg_expr ,  sugg_expr) ) 
377-                             } 
367+                         let  field_name =  if   is_struct_pat_shorthand_field { 
368+                             format ! ( "{}: " ,  sugg_expr ) 
369+                         }   else   { 
370+                             String :: new ( ) 
371+                         } ; 
372+                         return   Some ( match  mutability  { 
373+                             hir :: Mutability :: MutMutable  =>  ( 
374+                                 sp , 
375+                                  "consider mutably borrowing here" , 
376+                                 format ! ( "{}&mut {}" ,  field_name ,  sugg_expr ) , 
377+                             ) , 
378+                             hir :: Mutability :: MutImmutable  =>  ( 
379+                                 sp , 
380+                                 "consider borrowing here" , 
381+                                 format ! ( "{}&{}" ,  field_name ,  sugg_expr) , 
382+                             ) , 
378383                        } ) ; 
379384                    } 
380385                } 
0 commit comments