@@ -118,7 +118,6 @@ use syntax::parse::token::{self, InternedString, keywords};
118
118
use syntax:: ptr:: P ;
119
119
use syntax:: util:: lev_distance:: find_best_match_for_name;
120
120
use syntax_pos:: { self , Span } ;
121
- use errors:: DiagnosticBuilder ;
122
121
123
122
use rustc:: hir:: intravisit:: { self , Visitor } ;
124
123
use rustc:: hir:: { self , PatKind } ;
@@ -2959,7 +2958,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
2959
2958
} , expr_t) ;
2960
2959
match expr_t. sty {
2961
2960
ty:: TyStruct ( def, _) | ty:: TyUnion ( def, _) => {
2962
- Self :: suggest_field_names ( & mut err, def. struct_variant ( ) , field, vec ! [ ] ) ;
2961
+ if let Some ( suggested_field_name) =
2962
+ Self :: suggest_field_name ( def. struct_variant ( ) , field, vec ! [ ] ) {
2963
+ err. span_help ( field. span ,
2964
+ & format ! ( "did you mean `{}`?" , suggested_field_name) ) ;
2965
+ } ;
2963
2966
}
2964
2967
ty:: TyRawPtr ( ..) => {
2965
2968
err. note ( & format ! ( "`{0}` is a native pointer; perhaps you need to deref with \
@@ -2972,11 +2975,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
2972
2975
}
2973
2976
}
2974
2977
2975
- // displays hints about the closest matches in field names
2976
- fn suggest_field_names ( err : & mut DiagnosticBuilder ,
2977
- variant : ty :: VariantDef < ' tcx > ,
2978
- field : & Spanned < ast :: Name > ,
2979
- skip : Vec < InternedString > ) {
2978
+ // Return an hint about the closest match in field names
2979
+ fn suggest_field_name ( variant : ty :: VariantDef < ' tcx > ,
2980
+ field : & Spanned < ast :: Name > ,
2981
+ skip : Vec < InternedString > )
2982
+ -> Option < InternedString > {
2980
2983
let name = field. node . as_str ( ) ;
2981
2984
let names = variant. fields . iter ( ) . filter_map ( |field| {
2982
2985
// ignore already set fields and private fields from non-local crates
@@ -2989,10 +2992,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
2989
2992
} ) ;
2990
2993
2991
2994
// only find fits with at least one matching letter
2992
- if let Some ( name) = find_best_match_for_name ( names, & name, Some ( name. len ( ) ) ) {
2993
- err. span_help ( field. span ,
2994
- & format ! ( "did you mean `{}`?" , name) ) ;
2995
- }
2995
+ find_best_match_for_name ( names, & name, Some ( name. len ( ) ) )
2996
2996
}
2997
2997
2998
2998
// Check tuple index expressions
@@ -3086,7 +3086,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3086
3086
ty) ;
3087
3087
// prevent all specified fields from being suggested
3088
3088
let skip_fields = skip_fields. iter ( ) . map ( |ref x| x. name . node . as_str ( ) ) ;
3089
- Self :: suggest_field_names ( & mut err, variant, & field. name , skip_fields. collect ( ) ) ;
3089
+ if let Some ( field_name) = Self :: suggest_field_name ( variant,
3090
+ & field. name ,
3091
+ skip_fields. collect ( ) ) {
3092
+ err. span_label ( field. name . span , & format ! ( "did you mean `{}`?" , field_name) ) ;
3093
+ } ;
3090
3094
err. emit ( ) ;
3091
3095
}
3092
3096
0 commit comments