@@ -1100,12 +1100,12 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
1100
1100
}
1101
1101
let decl_span = local_decl. source_info . span ;
1102
1102
1103
- let label = match * local_decl. local_info ( ) {
1103
+ let amp_mut_sugg = match * local_decl. local_info ( ) {
1104
1104
LocalInfo :: User ( mir:: BindingForm :: ImplicitSelf ( _) ) => {
1105
1105
let suggestion = suggest_ampmut_self ( self . infcx . tcx , decl_span) ;
1106
1106
let additional =
1107
1107
local_trait. map ( |span| ( span, suggest_ampmut_self ( self . infcx . tcx , span) ) ) ;
1108
- Some ( ( true , decl_span, suggestion, additional) )
1108
+ Some ( AmpMutSugg { has_sugg : true , span : decl_span, suggestion, additional } )
1109
1109
}
1110
1110
1111
1111
LocalInfo :: User ( mir:: BindingForm :: Var ( mir:: VarBindingForm {
@@ -1165,7 +1165,12 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
1165
1165
..
1166
1166
} ) ) => {
1167
1167
let sugg = suggest_ampmut_self ( self . infcx . tcx , decl_span) ;
1168
- Some ( ( true , decl_span, sugg, None ) )
1168
+ Some ( AmpMutSugg {
1169
+ has_sugg : true ,
1170
+ span : decl_span,
1171
+ suggestion : sugg,
1172
+ additional : None ,
1173
+ } )
1169
1174
}
1170
1175
// explicit self (eg `self: &'a Self`)
1171
1176
_ => suggest_ampmut (
@@ -1186,15 +1191,24 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
1186
1191
..
1187
1192
} ) ) => {
1188
1193
let pattern_span: Span = local_decl. source_info . span ;
1189
- suggest_ref_mut ( self . infcx . tcx , pattern_span)
1190
- . map ( |span| ( true , span, "mut " . to_owned ( ) , None ) )
1194
+ suggest_ref_mut ( self . infcx . tcx , pattern_span) . map ( |span| AmpMutSugg {
1195
+ has_sugg : true ,
1196
+ span,
1197
+ suggestion : "mut " . to_owned ( ) ,
1198
+ additional : None ,
1199
+ } )
1191
1200
}
1192
1201
1193
1202
_ => unreachable ! ( ) ,
1194
1203
} ;
1195
1204
1196
- match label {
1197
- Some ( ( true , err_help_span, suggested_code, additional) ) => {
1205
+ match amp_mut_sugg {
1206
+ Some ( AmpMutSugg {
1207
+ has_sugg : true ,
1208
+ span : err_help_span,
1209
+ suggestion : suggested_code,
1210
+ additional,
1211
+ } ) => {
1198
1212
let mut sugg = vec ! [ ( err_help_span, suggested_code) ] ;
1199
1213
if let Some ( s) = additional {
1200
1214
sugg. push ( s) ;
@@ -1216,7 +1230,9 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
1216
1230
) ;
1217
1231
}
1218
1232
}
1219
- Some ( ( false , err_label_span, message, _) ) => {
1233
+ Some ( AmpMutSugg {
1234
+ has_sugg : false , span : err_label_span, suggestion : message, ..
1235
+ } ) => {
1220
1236
let def_id = self . body . source . def_id ( ) ;
1221
1237
let hir_id = if let Some ( local_def_id) = def_id. as_local ( )
1222
1238
&& let Some ( body) = self . infcx . tcx . hir ( ) . maybe_body_owned_by ( local_def_id)
@@ -1421,6 +1437,13 @@ fn suggest_ampmut_self<'tcx>(tcx: TyCtxt<'tcx>, span: Span) -> String {
1421
1437
}
1422
1438
}
1423
1439
1440
+ struct AmpMutSugg {
1441
+ has_sugg : bool ,
1442
+ span : Span ,
1443
+ suggestion : String ,
1444
+ additional : Option < ( Span , String ) > ,
1445
+ }
1446
+
1424
1447
// When we want to suggest a user change a local variable to be a `&mut`, there
1425
1448
// are three potential "obvious" things to highlight:
1426
1449
//
@@ -1442,7 +1465,7 @@ fn suggest_ampmut<'tcx>(
1442
1465
decl_span : Span ,
1443
1466
opt_assignment_rhs_span : Option < Span > ,
1444
1467
opt_ty_info : Option < Span > ,
1445
- ) -> Option < ( bool , Span , String , Option < ( Span , String ) > ) > {
1468
+ ) -> Option < AmpMutSugg > {
1446
1469
// if there is a RHS and it starts with a `&` from it, then check if it is
1447
1470
// mutable, and if not, put suggest putting `mut ` to make it mutable.
1448
1471
// we don't have to worry about lifetime annotations here because they are
@@ -1483,7 +1506,12 @@ fn suggest_ampmut<'tcx>(
1483
1506
1484
1507
// FIXME(Ezrashaw): returning is bad because we still might want to
1485
1508
// update the annotated type, see #106857.
1486
- return Some ( ( true , span, "mut " . to_owned ( ) , None ) ) ;
1509
+ return Some ( AmpMutSugg {
1510
+ has_sugg : true ,
1511
+ span,
1512
+ suggestion : "mut " . to_owned ( ) ,
1513
+ additional : None ,
1514
+ } ) ;
1487
1515
}
1488
1516
}
1489
1517
@@ -1508,18 +1536,23 @@ fn suggest_ampmut<'tcx>(
1508
1536
&& let Some ( ws_pos) = src. find ( char:: is_whitespace)
1509
1537
{
1510
1538
let span = span. with_lo ( span. lo ( ) + BytePos ( ws_pos as u32 ) ) . shrink_to_lo ( ) ;
1511
- Some ( ( true , span, " mut" . to_owned ( ) , None ) )
1539
+ Some ( AmpMutSugg { has_sugg : true , span, suggestion : " mut" . to_owned ( ) , additional : None } )
1512
1540
// if there is already a binding, we modify it to be `mut`
1513
1541
} else if binding_exists {
1514
1542
// shrink the span to just after the `&` in `&variable`
1515
1543
let span = span. with_lo ( span. lo ( ) + BytePos ( 1 ) ) . shrink_to_lo ( ) ;
1516
- Some ( ( true , span, "mut " . to_owned ( ) , None ) )
1544
+ Some ( AmpMutSugg { has_sugg : true , span, suggestion : "mut " . to_owned ( ) , additional : None } )
1517
1545
} else {
1518
1546
// otherwise, suggest that the user annotates the binding; we provide the
1519
1547
// type of the local.
1520
1548
let ty = decl_ty. builtin_deref ( true ) . unwrap ( ) ;
1521
1549
1522
- Some ( ( false , span, format ! ( "{}mut {}" , if decl_ty. is_ref( ) { "&" } else { "*" } , ty) , None ) )
1550
+ Some ( AmpMutSugg {
1551
+ has_sugg : false ,
1552
+ span,
1553
+ suggestion : format ! ( "{}mut {}" , if decl_ty. is_ref( ) { "&" } else { "*" } , ty) ,
1554
+ additional : None ,
1555
+ } )
1523
1556
}
1524
1557
}
1525
1558
0 commit comments