@@ -24,7 +24,7 @@ use rustc_infer::infer::TypeTrace;
2424use rustc_middle:: ty:: adjustment:: AllowTwoPhase ;
2525use rustc_middle:: ty:: error:: TypeError ;
2626use rustc_middle:: ty:: fold:: TypeFoldable ;
27- use rustc_middle:: ty:: { self , Ty } ;
27+ use rustc_middle:: ty:: { self , Ty , TyCtxt } ;
2828use rustc_session:: Session ;
2929use rustc_span:: symbol:: Ident ;
3030use rustc_span:: { self , Span } ;
@@ -523,24 +523,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
523523 format ! ( "arguments to this {} are incorrect" , call_name) ,
524524 ) ;
525525 // 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) ;
544527 err. emit ( ) ;
545528 break ' errors;
546529 }
@@ -558,24 +541,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
558541 DiagnosticId :: Error ( err_code. to_owned ( ) ) ,
559542 ) ;
560543 // 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) ;
579545 err. multipart_suggestion (
580546 "use parentheses to construct a tuple" ,
581547 vec ! [ ( start, '(' . to_string( ) ) , ( end, ')' . to_string( ) ) ] ,
@@ -613,24 +579,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
613579 format ! ( "arguments to this {} are incorrect" , call_name) ,
614580 ) ;
615581 // 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) ;
634583 err. emit ( ) ;
635584 break ' errors;
636585 }
@@ -948,24 +897,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
948897 }
949898
950899 // 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) ;
969901
970902 // And add a suggestion block for all of the parameters
971903 let suggestion_text = match suggestion_text {
@@ -1790,3 +1722,47 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
17901722 }
17911723 }
17921724}
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