@@ -424,87 +424,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
424
424
425
425
match label {
426
426
Some ( ( true , err_help_span, suggested_code) ) => {
427
- /// User cannot make signature of a trait mutable
428
- /// without changing the trait. So we find if this
429
- /// error belongs to a trait and if so we move
430
- /// suggestion to the trait or disable it if it is
431
- /// out of scope of this crate
432
- let ( is_trait_sig, local_trait) = {
433
- if self . body . local_kind ( local) != LocalKind :: Arg {
434
- ( false , None )
435
- } else {
436
- let hir_map = self . infcx . tcx . hir ( ) ;
437
- let my_hir = hir_map. local_def_id_to_hir_id (
438
- self . body . source . def_id ( ) . as_local ( ) . unwrap ( ) ,
439
- ) ;
440
- match hir_map. find ( hir_map. get_parent_node ( my_hir) ) {
441
- Some ( Node :: Item ( hir:: Item {
442
- kind :
443
- hir:: ItemKind :: Impl ( hir:: Impl {
444
- of_trait :
445
- Some ( hir:: TraitRef {
446
- path :
447
- hir:: Path {
448
- res :
449
- hir:: def:: Res :: Def ( _, td) ,
450
- ..
451
- } ,
452
- ..
453
- } ) ,
454
- ..
455
- } ) ,
456
- ..
457
- } ) ) => {
458
- ( true , td. as_local ( ) . and_then ( |tld| {
459
- let h = hir_map. local_def_id_to_hir_id ( tld) ;
460
- match hir_map. find ( h) {
461
- Some ( Node :: Item ( hir:: Item {
462
- kind : hir:: ItemKind :: Trait (
463
- _, _, _, _,
464
- items
465
- ) ,
466
- ..
467
- } ) ) => {
468
- let mut f_in_trait_opt = None ;
469
- for hir:: TraitItemRef { id : fi, kind : k, .. } in * items {
470
- let hi = fi. hir_id ( ) ;
471
- if !matches ! ( k, hir:: AssocItemKind :: Fn { .. } ) {
472
- continue ;
473
- }
474
- if hir_map. name ( hi) != hir_map. name ( my_hir) {
475
- continue ;
476
- }
477
- f_in_trait_opt = Some ( hi) ;
478
- break ;
479
- }
480
- f_in_trait_opt. and_then ( |f_in_trait| {
481
- match hir_map. find ( f_in_trait) {
482
- Some ( Node :: TraitItem ( hir:: TraitItem {
483
- kind : hir:: TraitItemKind :: Fn ( hir:: FnSig {
484
- decl : hir:: FnDecl {
485
- inputs,
486
- ..
487
- } ,
488
- ..
489
- } , _) ,
490
- ..
491
- } ) ) => {
492
- let hir:: Ty { span, .. } = inputs[ local. index ( ) - 1 ] ;
493
- Some ( span)
494
- } ,
495
- _ => None ,
496
- }
497
- } )
498
- //Some(hir_map.span(h))
499
- }
500
- _ => None
501
- }
502
- } ) )
503
- }
504
- _ => ( false , None ) ,
505
- }
506
- }
507
- } ;
427
+ let ( is_trait_sig, local_trait) = self . is_error_in_trait ( local) ;
508
428
if !is_trait_sig {
509
429
err. span_suggestion (
510
430
err_help_span,
@@ -595,6 +515,84 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
595
515
596
516
err. buffer ( & mut self . errors_buffer ) ;
597
517
}
518
+
519
+ /// User cannot make signature of a trait mutable without changing the
520
+ /// trait. So we find if this error belongs to a trait and if so we move
521
+ /// suggestion to the trait or disable it if it is out of scope of this crate
522
+ fn is_error_in_trait ( & self , local : Local ) -> ( bool , Option < Span > ) {
523
+ if self . body . local_kind ( local) != LocalKind :: Arg {
524
+ return ( false , None ) ;
525
+ }
526
+ let hir_map = self . infcx . tcx . hir ( ) ;
527
+ let my_hir = hir_map. local_def_id_to_hir_id (
528
+ self . body . source . def_id ( ) . as_local ( ) . unwrap ( ) ,
529
+ ) ;
530
+ match hir_map. find ( hir_map. get_parent_node ( my_hir) ) {
531
+ Some ( Node :: Item ( hir:: Item {
532
+ kind :
533
+ hir:: ItemKind :: Impl ( hir:: Impl {
534
+ of_trait :
535
+ Some ( hir:: TraitRef {
536
+ path :
537
+ hir:: Path {
538
+ res :
539
+ hir:: def:: Res :: Def ( _, td) ,
540
+ ..
541
+ } ,
542
+ ..
543
+ } ) ,
544
+ ..
545
+ } ) ,
546
+ ..
547
+ } ) ) => {
548
+ ( true , td. as_local ( ) . and_then ( |tld| {
549
+ let h = hir_map. local_def_id_to_hir_id ( tld) ;
550
+ match hir_map. find ( h) {
551
+ Some ( Node :: Item ( hir:: Item {
552
+ kind : hir:: ItemKind :: Trait (
553
+ _, _, _, _,
554
+ items
555
+ ) ,
556
+ ..
557
+ } ) ) => {
558
+ let mut f_in_trait_opt = None ;
559
+ for hir:: TraitItemRef { id : fi, kind : k, .. } in * items {
560
+ let hi = fi. hir_id ( ) ;
561
+ if !matches ! ( k, hir:: AssocItemKind :: Fn { .. } ) {
562
+ continue ;
563
+ }
564
+ if hir_map. name ( hi) != hir_map. name ( my_hir) {
565
+ continue ;
566
+ }
567
+ f_in_trait_opt = Some ( hi) ;
568
+ break ;
569
+ }
570
+ f_in_trait_opt. and_then ( |f_in_trait| {
571
+ match hir_map. find ( f_in_trait) {
572
+ Some ( Node :: TraitItem ( hir:: TraitItem {
573
+ kind : hir:: TraitItemKind :: Fn ( hir:: FnSig {
574
+ decl : hir:: FnDecl {
575
+ inputs,
576
+ ..
577
+ } ,
578
+ ..
579
+ } , _) ,
580
+ ..
581
+ } ) ) => {
582
+ let hir:: Ty { span, .. } = inputs[ local. index ( ) - 1 ] ;
583
+ Some ( span)
584
+ } ,
585
+ _ => None ,
586
+ }
587
+ } )
588
+ }
589
+ _ => None
590
+ }
591
+ } ) )
592
+ }
593
+ _ => ( false , None ) ,
594
+ }
595
+ }
598
596
599
597
// point to span of upvar making closure call require mutable borrow
600
598
fn show_mutating_upvar (
0 commit comments