@@ -2551,10 +2551,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2551
2551
2552
2552
match * base_ty. peel_refs ( ) . kind ( ) {
2553
2553
ty:: Array ( _, len) => {
2554
- self . maybe_suggest_array_indexing ( & mut err, expr , base, ident, len) ;
2554
+ self . maybe_suggest_array_indexing ( & mut err, base, ident, len) ;
2555
2555
}
2556
2556
ty:: RawPtr ( ..) => {
2557
- self . suggest_first_deref_field ( & mut err, expr , base, ident) ;
2557
+ self . suggest_first_deref_field ( & mut err, base, ident) ;
2558
2558
}
2559
2559
ty:: Param ( param_ty) => {
2560
2560
err. span_label ( ident. span , "unknown field" ) ;
@@ -2721,40 +2721,48 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2721
2721
fn maybe_suggest_array_indexing (
2722
2722
& self ,
2723
2723
err : & mut Diag < ' _ > ,
2724
- expr : & hir:: Expr < ' _ > ,
2725
2724
base : & hir:: Expr < ' _ > ,
2726
2725
field : Ident ,
2727
2726
len : ty:: Const < ' tcx > ,
2728
2727
) {
2729
2728
err. span_label ( field. span , "unknown field" ) ;
2730
2729
if let ( Some ( len) , Ok ( user_index) ) =
2731
2730
( len. try_eval_target_usize ( self . tcx , self . param_env ) , field. as_str ( ) . parse :: < u64 > ( ) )
2732
- && let Ok ( base) = self . tcx . sess . source_map ( ) . span_to_snippet ( base. span )
2733
2731
{
2734
2732
let help = "instead of using tuple indexing, use array indexing" ;
2735
- let suggestion = format ! ( "{base}[{field}]" ) ;
2736
2733
let applicability = if len < user_index {
2737
2734
Applicability :: MachineApplicable
2738
2735
} else {
2739
2736
Applicability :: MaybeIncorrect
2740
2737
} ;
2741
- err. span_suggestion ( expr. span , help, suggestion, applicability) ;
2738
+ err. multipart_suggestion (
2739
+ help,
2740
+ vec ! [
2741
+ ( base. span. between( field. span) , "[" . to_string( ) ) ,
2742
+ ( field. span. shrink_to_hi( ) , "]" . to_string( ) ) ,
2743
+ ] ,
2744
+ applicability,
2745
+ ) ;
2742
2746
}
2743
2747
}
2744
2748
2745
- fn suggest_first_deref_field (
2746
- & self ,
2747
- err : & mut Diag < ' _ > ,
2748
- expr : & hir:: Expr < ' _ > ,
2749
- base : & hir:: Expr < ' _ > ,
2750
- field : Ident ,
2751
- ) {
2749
+ fn suggest_first_deref_field ( & self , err : & mut Diag < ' _ > , base : & hir:: Expr < ' _ > , field : Ident ) {
2752
2750
err. span_label ( field. span , "unknown field" ) ;
2753
- if let Ok ( base) = self . tcx . sess . source_map ( ) . span_to_snippet ( base. span ) {
2754
- let msg = format ! ( "`{base}` is a raw pointer; try dereferencing it" ) ;
2755
- let suggestion = format ! ( "(*{base}).{field}" ) ;
2756
- err. span_suggestion ( expr. span , msg, suggestion, Applicability :: MaybeIncorrect ) ;
2757
- }
2751
+ let val = if let Ok ( base) = self . tcx . sess . source_map ( ) . span_to_snippet ( base. span )
2752
+ && base. len ( ) < 20
2753
+ {
2754
+ format ! ( "`{base}`" )
2755
+ } else {
2756
+ "the value" . to_string ( )
2757
+ } ;
2758
+ err. multipart_suggestion (
2759
+ format ! ( "{val} is a raw pointer; try dereferencing it" ) ,
2760
+ vec ! [
2761
+ ( base. span. shrink_to_lo( ) , "(*" . to_string( ) ) ,
2762
+ ( base. span. shrink_to_hi( ) , ")" . to_string( ) ) ,
2763
+ ] ,
2764
+ Applicability :: MaybeIncorrect ,
2765
+ ) ;
2758
2766
}
2759
2767
2760
2768
fn no_such_field_err ( & self , field : Ident , expr_t : Ty < ' tcx > , id : HirId ) -> Diag < ' _ > {
0 commit comments