@@ -249,6 +249,26 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
249
249
None
250
250
}
251
251
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
+
252
272
/// This function is used to determine potential "simple" improvements or users' errors and
253
273
/// provide them useful help. For example:
254
274
///
@@ -277,23 +297,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
277
297
return None ;
278
298
}
279
299
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 ) ;
297
302
298
303
match ( & expected. sty , & checked_ty. sty ) {
299
304
( & ty:: Ref ( _, exp, _) , & ty:: Ref ( _, check, _) ) => match ( & exp. sty , & check. sty ) {
@@ -333,12 +338,12 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
333
338
// bar(&x); // error, expected &mut
334
339
// ```
335
340
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
+ }
342
347
} ;
343
348
if self . can_coerce ( ref_ty, expected) {
344
349
if let Ok ( src) = cm. span_to_snippet ( sp) {
@@ -359,22 +364,22 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
359
364
if let Some ( sugg) = self . can_use_as_ref ( expr) {
360
365
return Some ( sugg) ;
361
366
}
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
+ ) ,
378
383
} ) ;
379
384
}
380
385
}
0 commit comments