@@ -36,8 +36,9 @@ use lint;
36
36
37
37
use std:: iter;
38
38
use syntax:: ast;
39
- use syntax:: ptr:: P ;
40
39
use syntax:: feature_gate:: { GateIssue , emit_feature_err} ;
40
+ use syntax:: ptr:: P ;
41
+ use syntax:: util:: lev_distance:: find_best_match_for_name;
41
42
use syntax_pos:: { DUMMY_SP , Span , MultiSpan } ;
42
43
43
44
pub trait AstConv < ' gcx , ' tcx > {
@@ -1303,6 +1304,32 @@ impl<'o, 'gcx: 'tcx, 'tcx> dyn AstConv<'gcx, 'tcx>+'o {
1303
1304
Err ( ErrorReported ) => return ( tcx. types . err , Def :: Err ) ,
1304
1305
}
1305
1306
}
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
+ }
1306
1333
_ => {
1307
1334
// Don't print TyErr to the user.
1308
1335
if !ty. references_error ( ) {
0 commit comments