@@ -36,8 +36,9 @@ use lint;
3636
3737use std:: iter;
3838use syntax:: ast;
39- use syntax:: ptr:: P ;
4039use syntax:: feature_gate:: { GateIssue , emit_feature_err} ;
40+ use syntax:: ptr:: P ;
41+ use syntax:: util:: lev_distance:: find_best_match_for_name;
4142use syntax_pos:: { DUMMY_SP , Span , MultiSpan } ;
4243
4344pub trait AstConv < ' gcx , ' tcx > {
@@ -1303,6 +1304,32 @@ impl<'o, 'gcx: 'tcx, 'tcx> dyn AstConv<'gcx, 'tcx>+'o {
13031304 Err ( ErrorReported ) => return ( tcx. types . err , Def :: Err ) ,
13041305 }
13051306 }
1307+ ( & ty:: Adt ( adt_def, _substs) , Def :: Enum ( _did) ) => {
1308+ let ty_str = ty. to_string ( ) ;
1309+ // Incorrect enum variant
1310+ let mut err = tcx. sess . struct_span_err (
1311+ span,
1312+ & format ! ( "no variant `{}` on enum `{}`" , & assoc_name. as_str( ) , ty_str) ,
1313+ ) ;
1314+ // Check if it was a typo
1315+ let input = adt_def. variants . iter ( ) . map ( |variant| & variant. name ) ;
1316+ if let Some ( suggested_name) = find_best_match_for_name (
1317+ input,
1318+ & assoc_name. as_str ( ) ,
1319+ None ,
1320+ ) {
1321+ err. span_suggestion_with_applicability (
1322+ span,
1323+ "did you mean" ,
1324+ format ! ( "{}::{}" , ty_str, suggested_name. to_string( ) ) ,
1325+ Applicability :: MaybeIncorrect ,
1326+ ) ;
1327+ } else {
1328+ err. span_label ( span, "unknown variant" ) ;
1329+ }
1330+ err. emit ( ) ;
1331+ return ( tcx. types . err , Def :: Err ) ;
1332+ }
13061333 _ => {
13071334 // Don't print TyErr to the user.
13081335 if !ty. references_error ( ) {
0 commit comments