@@ -363,11 +363,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
363
363
}
364
364
}
365
365
366
- let compatible_variants: Vec < ( String , Option < String > ) > = expected_adt
366
+ let compatible_variants: Vec < ( String , _ , _ , Option < String > ) > = expected_adt
367
367
. variants ( )
368
368
. iter ( )
369
369
. filter ( |variant| {
370
- variant. fields . len ( ) == 1 && variant . ctor_kind == hir :: def :: CtorKind :: Fn
370
+ variant. fields . len ( ) == 1
371
371
} )
372
372
. filter_map ( |variant| {
373
373
let sole_field = & variant. fields [ 0 ] ;
@@ -391,9 +391,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
391
391
if let Some ( path) = variant_path. strip_prefix ( "std::prelude::" )
392
392
&& let Some ( ( _, path) ) = path. split_once ( "::" )
393
393
{
394
- return Some ( ( path. to_string ( ) , note_about_variant_field_privacy) ) ;
394
+ return Some ( ( path. to_string ( ) , variant . ctor_kind , sole_field . name , note_about_variant_field_privacy) ) ;
395
395
}
396
- Some ( ( variant_path, note_about_variant_field_privacy) )
396
+ Some ( ( variant_path, variant . ctor_kind , sole_field . name , note_about_variant_field_privacy) )
397
397
} else {
398
398
None
399
399
}
@@ -405,18 +405,31 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
405
405
None => String :: new ( ) ,
406
406
} ;
407
407
408
+ fn brackets_for (
409
+ ctor : hir:: def:: CtorKind ,
410
+ field_name : Symbol ,
411
+ ) -> ( String , & ' static str ) {
412
+ match ctor {
413
+ hir:: def:: CtorKind :: Fn => ( "(" . to_owned ( ) , ")" ) ,
414
+ hir:: def:: CtorKind :: Fictive => ( format ! ( " {{ {field_name}: " ) , " }" ) ,
415
+ hir:: def:: CtorKind :: Const => unreachable ! ( ) ,
416
+ }
417
+ }
418
+
408
419
match & compatible_variants[ ..] {
409
420
[ ] => { /* No variants to format */ }
410
- [ ( variant, note) ] => {
421
+ [ ( variant, ctor_kind, field_name, note) ] => {
422
+ let ( open, close) = brackets_for ( * ctor_kind, * field_name) ;
423
+
411
424
// Just a single matching variant.
412
425
err. multipart_suggestion_verbose (
413
426
& format ! (
414
427
"try wrapping the expression in `{variant}`{note}" ,
415
428
note = note. as_deref( ) . unwrap_or( "" )
416
429
) ,
417
430
vec ! [
418
- ( expr. span. shrink_to_lo( ) , format!( "{prefix}{variant}( " ) ) ,
419
- ( expr. span. shrink_to_hi( ) , ")" . to_string ( ) ) ,
431
+ ( expr. span. shrink_to_lo( ) , format!( "{prefix}{variant}{open} " ) ) ,
432
+ ( expr. span. shrink_to_hi( ) , close . to_owned ( ) ) ,
420
433
] ,
421
434
Applicability :: MaybeIncorrect ,
422
435
) ;
@@ -428,12 +441,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
428
441
"try wrapping the expression in a variant of `{}`" ,
429
442
self . tcx. def_path_str( expected_adt. did( ) )
430
443
) ,
431
- compatible_variants. into_iter ( ) . map ( |( variant, _) | {
432
- vec ! [
433
- ( expr. span. shrink_to_lo( ) , format!( "{prefix}{variant}(" ) ) ,
434
- ( expr. span. shrink_to_hi( ) , ")" . to_string( ) ) ,
435
- ]
436
- } ) ,
444
+ compatible_variants. into_iter ( ) . map (
445
+ |( variant, ctor_kind, field_name, _) | {
446
+ let ( open, close) = brackets_for ( ctor_kind, field_name) ;
447
+
448
+ vec ! [
449
+ ( expr. span. shrink_to_lo( ) , format!( "{prefix}{variant}{open}" ) ) ,
450
+ ( expr. span. shrink_to_hi( ) , close. to_owned( ) ) ,
451
+ ]
452
+ } ,
453
+ ) ,
437
454
Applicability :: MaybeIncorrect ,
438
455
) ;
439
456
}
0 commit comments