@@ -118,7 +118,6 @@ use syntax::parse::token::{self, InternedString, keywords};
118118use syntax:: ptr:: P ;
119119use syntax:: util:: lev_distance:: find_best_match_for_name;
120120use syntax_pos:: { self , Span } ;
121- use errors:: DiagnosticBuilder ;
122121
123122use rustc:: hir:: intravisit:: { self , Visitor } ;
124123use rustc:: hir:: { self , PatKind } ;
@@ -2959,7 +2958,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
29592958 } , expr_t) ;
29602959 match expr_t. sty {
29612960 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+ } ;
29632966 }
29642967 ty:: TyRawPtr ( ..) => {
29652968 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> {
29722975 }
29732976 }
29742977
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 > {
29802983 let name = field. node . as_str ( ) ;
29812984 let names = variant. fields . iter ( ) . filter_map ( |field| {
29822985 // ignore already set fields and private fields from non-local crates
@@ -2989,10 +2992,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
29892992 } ) ;
29902993
29912994 // 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 ( ) ) )
29962996 }
29972997
29982998 // Check tuple index expressions
@@ -3086,7 +3086,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
30863086 ty) ;
30873087 // prevent all specified fields from being suggested
30883088 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+ } ;
30903094 err. emit ( ) ;
30913095 }
30923096
0 commit comments