@@ -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 } ;
@@ -2996,7 +2995,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
2996
2995
} , expr_t) ;
2997
2996
match expr_t. sty {
2998
2997
ty:: TyStruct ( def, _) | ty:: TyUnion ( def, _) => {
2999
- Self :: suggest_field_names ( & mut err, def. struct_variant ( ) , field, vec ! [ ] ) ;
2998
+ if let Some ( suggested_field_name) =
2999
+ Self :: suggest_field_name ( def. struct_variant ( ) , field, vec ! [ ] ) {
3000
+ err. span_help ( field. span ,
3001
+ & format ! ( "did you mean `{}`?" , suggested_field_name) ) ;
3002
+ } ;
3000
3003
}
3001
3004
ty:: TyRawPtr ( ..) => {
3002
3005
err. note ( & format ! ( "`{0}` is a native pointer; perhaps you need to deref with \
@@ -3009,11 +3012,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3009
3012
}
3010
3013
}
3011
3014
3012
- // displays hints about the closest matches in field names
3013
- fn suggest_field_names ( err : & mut DiagnosticBuilder ,
3014
- variant : ty :: VariantDef < ' tcx > ,
3015
- field : & Spanned < ast :: Name > ,
3016
- skip : Vec < InternedString > ) {
3015
+ // Return an hint about the closest match in field names
3016
+ fn suggest_field_name ( variant : ty :: VariantDef < ' tcx > ,
3017
+ field : & Spanned < ast :: Name > ,
3018
+ skip : Vec < InternedString > )
3019
+ -> Option < InternedString > {
3017
3020
let name = field. node . as_str ( ) ;
3018
3021
let names = variant. fields . iter ( ) . filter_map ( |field| {
3019
3022
// ignore already set fields and private fields from non-local crates
@@ -3026,10 +3029,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3026
3029
} ) ;
3027
3030
3028
3031
// only find fits with at least one matching letter
3029
- if let Some ( name) = find_best_match_for_name ( names, & name, Some ( name. len ( ) ) ) {
3030
- err. span_help ( field. span ,
3031
- & format ! ( "did you mean `{}`?" , name) ) ;
3032
- }
3032
+ find_best_match_for_name ( names, & name, Some ( name. len ( ) ) )
3033
3033
}
3034
3034
3035
3035
// Check tuple index expressions
@@ -3125,7 +3125,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3125
3125
ty) ;
3126
3126
// prevent all specified fields from being suggested
3127
3127
let skip_fields = skip_fields. iter ( ) . map ( |ref x| x. name . node . as_str ( ) ) ;
3128
- Self :: suggest_field_names ( & mut err, variant, & field. name , skip_fields. collect ( ) ) ;
3128
+ if let Some ( field_name) = Self :: suggest_field_name ( variant,
3129
+ & field. name ,
3130
+ skip_fields. collect ( ) ) {
3131
+ err. span_label ( field. name . span , & format ! ( "did you mean `{}`?" , field_name) ) ;
3132
+ } ;
3129
3133
err. emit ( ) ;
3130
3134
}
3131
3135
0 commit comments