@@ -301,8 +301,41 @@ fn early_lint_checks(tcx: TyCtxt<'_>, (): ()) {
301
301
for ( ident, mut spans) in identifiers. drain ( ..) {
302
302
spans. sort ( ) ;
303
303
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
+
304
320
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 } ) ;
306
339
} else {
307
340
sess. dcx ( ) . emit_err ( errors:: EmojiIdentifier { spans, ident } ) ;
308
341
}
0 commit comments