@@ -24,7 +24,7 @@ use rustc_infer::infer::TypeTrace;
24
24
use rustc_middle:: ty:: adjustment:: AllowTwoPhase ;
25
25
use rustc_middle:: ty:: error:: TypeError ;
26
26
use rustc_middle:: ty:: fold:: TypeFoldable ;
27
- use rustc_middle:: ty:: { self , Ty } ;
27
+ use rustc_middle:: ty:: { self , Ty , TyCtxt } ;
28
28
use rustc_session:: Session ;
29
29
use rustc_span:: symbol:: Ident ;
30
30
use rustc_span:: { self , Span } ;
@@ -523,24 +523,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
523
523
format ! ( "arguments to this {} are incorrect" , call_name) ,
524
524
) ;
525
525
// Call out where the function is defined
526
- if let Some ( def_id) = fn_def_id && let Some ( def_span) = tcx. def_ident_span ( def_id) {
527
- let mut spans: MultiSpan = def_span. into ( ) ;
528
-
529
- let params = tcx
530
- . hir ( )
531
- . get_if_local ( def_id)
532
- . and_then ( |node| node. body_id ( ) )
533
- . into_iter ( )
534
- . map ( |id| tcx. hir ( ) . body ( id) . params )
535
- . flatten ( ) ;
536
-
537
- for param in params {
538
- spans. push_span_label ( param. span , String :: new ( ) ) ;
539
- }
540
-
541
- let def_kind = tcx. def_kind ( def_id) ;
542
- err. span_note ( spans, & format ! ( "{} defined here" , def_kind. descr( def_id) ) ) ;
543
- }
526
+ label_fn_like ( tcx, & mut err, fn_def_id) ;
544
527
err. emit ( ) ;
545
528
break ' errors;
546
529
}
@@ -558,24 +541,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
558
541
DiagnosticId :: Error ( err_code. to_owned ( ) ) ,
559
542
) ;
560
543
// Call out where the function is defined
561
- if let Some ( def_id) = fn_def_id && let Some ( def_span) = tcx. def_ident_span ( def_id) {
562
- let mut spans: MultiSpan = def_span. into ( ) ;
563
-
564
- let params = tcx
565
- . hir ( )
566
- . get_if_local ( def_id)
567
- . and_then ( |node| node. body_id ( ) )
568
- . into_iter ( )
569
- . map ( |id| tcx. hir ( ) . body ( id) . params )
570
- . flatten ( ) ;
571
-
572
- for param in params {
573
- spans. push_span_label ( param. span , String :: new ( ) ) ;
574
- }
575
-
576
- let def_kind = tcx. def_kind ( def_id) ;
577
- err. span_note ( spans, & format ! ( "{} defined here" , def_kind. descr( def_id) ) ) ;
578
- }
544
+ label_fn_like ( tcx, & mut err, fn_def_id) ;
579
545
err. multipart_suggestion (
580
546
"use parentheses to construct a tuple" ,
581
547
vec ! [ ( start, '(' . to_string( ) ) , ( end, ')' . to_string( ) ) ] ,
@@ -613,24 +579,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
613
579
format ! ( "arguments to this {} are incorrect" , call_name) ,
614
580
) ;
615
581
// Call out where the function is defined
616
- if let Some ( def_id) = fn_def_id && let Some ( def_span) = tcx. def_ident_span ( def_id) {
617
- let mut spans: MultiSpan = def_span. into ( ) ;
618
-
619
- let params = tcx
620
- . hir ( )
621
- . get_if_local ( def_id)
622
- . and_then ( |node| node. body_id ( ) )
623
- . into_iter ( )
624
- . map ( |id| tcx. hir ( ) . body ( id) . params )
625
- . flatten ( ) ;
626
-
627
- for param in params {
628
- spans. push_span_label ( param. span , String :: new ( ) ) ;
629
- }
630
-
631
- let def_kind = tcx. def_kind ( def_id) ;
632
- err. span_note ( spans, & format ! ( "{} defined here" , def_kind. descr( def_id) ) ) ;
633
- }
582
+ label_fn_like ( tcx, & mut err, fn_def_id) ;
634
583
err. emit ( ) ;
635
584
break ' errors;
636
585
}
@@ -948,24 +897,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
948
897
}
949
898
950
899
// Call out where the function is defined
951
- if let Some ( def_id) = fn_def_id && let Some ( def_span) = tcx. def_ident_span ( def_id) {
952
- let mut spans: MultiSpan = def_span. into ( ) ;
953
-
954
- let params = tcx
955
- . hir ( )
956
- . get_if_local ( def_id)
957
- . and_then ( |node| node. body_id ( ) )
958
- . into_iter ( )
959
- . flat_map ( |id| tcx. hir ( ) . body ( id) . params )
960
- ;
961
-
962
- for param in params {
963
- spans. push_span_label ( param. span , String :: new ( ) ) ;
964
- }
965
-
966
- let def_kind = tcx. def_kind ( def_id) ;
967
- err. span_note ( spans, & format ! ( "{} defined here" , def_kind. descr( def_id) ) ) ;
968
- }
900
+ label_fn_like ( tcx, & mut err, fn_def_id) ;
969
901
970
902
// And add a suggestion block for all of the parameters
971
903
let suggestion_text = match suggestion_text {
@@ -1790,3 +1722,47 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1790
1722
}
1791
1723
}
1792
1724
}
1725
+
1726
+ fn label_fn_like < ' tcx > (
1727
+ tcx : TyCtxt < ' tcx > ,
1728
+ err : & mut rustc_errors:: DiagnosticBuilder < ' tcx , rustc_errors:: ErrorGuaranteed > ,
1729
+ def_id : Option < DefId > ,
1730
+ ) {
1731
+ let Some ( def_id) = def_id else {
1732
+ return ;
1733
+ } ;
1734
+
1735
+ if let Some ( def_span) = tcx. def_ident_span ( def_id) {
1736
+ let mut spans: MultiSpan = def_span. into ( ) ;
1737
+
1738
+ let params = tcx
1739
+ . hir ( )
1740
+ . get_if_local ( def_id)
1741
+ . and_then ( |node| node. body_id ( ) )
1742
+ . into_iter ( )
1743
+ . map ( |id| tcx. hir ( ) . body ( id) . params )
1744
+ . flatten ( ) ;
1745
+
1746
+ for param in params {
1747
+ spans. push_span_label ( param. span , String :: new ( ) ) ;
1748
+ }
1749
+
1750
+ let def_kind = tcx. def_kind ( def_id) ;
1751
+ err. span_note ( spans, & format ! ( "{} defined here" , def_kind. descr( def_id) ) ) ;
1752
+ } else {
1753
+ match tcx. hir ( ) . get_if_local ( def_id) {
1754
+ Some ( hir:: Node :: Expr ( hir:: Expr {
1755
+ kind : hir:: ExprKind :: Closure ( _, _, _, span, ..) ,
1756
+ ..
1757
+ } ) ) => {
1758
+ let spans: MultiSpan = ( * span) . into ( ) ;
1759
+
1760
+ // Note: We don't point to param spans here because they overlap
1761
+ // with the closure span itself
1762
+
1763
+ err. span_note ( spans, "closure defined here" ) ;
1764
+ }
1765
+ _ => { }
1766
+ }
1767
+ }
1768
+ }
0 commit comments