@@ -301,8 +301,41 @@ fn early_lint_checks(tcx: TyCtxt<'_>, (): ()) {
301301 for ( ident, mut spans) in identifiers. drain ( ..) {
302302 spans. sort ( ) ;
303303 if ident == sym:: ferris {
304+ enum FerrisFix {
305+ SnakeCase ,
306+ ScreamingSnakeCase ,
307+ PascalCase ,
308+ }
309+
310+ impl FerrisFix {
311+ const fn as_str ( self ) -> & ' static str {
312+ match self {
313+ FerrisFix :: SnakeCase => "ferris" ,
314+ FerrisFix :: ScreamingSnakeCase => "FERRIS" ,
315+ FerrisFix :: PascalCase => "Ferris" ,
316+ }
317+ }
318+ }
319+
304320 let first_span = spans[ 0 ] ;
305- sess. dcx ( ) . emit_err ( errors:: FerrisIdentifier { spans, first_span } ) ;
321+ let prev_source = sess. psess . source_map ( ) . span_to_prev_source ( first_span) ;
322+ let ferris_fix = prev_source
323+ . map_or ( FerrisFix :: SnakeCase , |source| {
324+ let mut source_before_ferris = source. trim_end ( ) . split_whitespace ( ) . rev ( ) ;
325+ match source_before_ferris. next ( ) {
326+ Some ( "struct" | "trait" | "mod" | "union" | "type" | "enum" ) => {
327+ FerrisFix :: PascalCase
328+ }
329+ Some ( "const" | "static" ) => FerrisFix :: ScreamingSnakeCase ,
330+ Some ( "mut" ) if source_before_ferris. next ( ) == Some ( "static" ) => {
331+ FerrisFix :: ScreamingSnakeCase
332+ }
333+ _ => FerrisFix :: SnakeCase ,
334+ }
335+ } )
336+ . as_str ( ) ;
337+
338+ sess. dcx ( ) . emit_err ( errors:: FerrisIdentifier { spans, first_span, ferris_fix } ) ;
306339 } else {
307340 sess. dcx ( ) . emit_err ( errors:: EmojiIdentifier { spans, ident } ) ;
308341 }
0 commit comments