@@ -559,35 +559,21 @@ impl<'db> DiagnosticVoucher<'db> for TyLowerDiag<'db> {
559559 . unwrap ( )
560560 . data ( db) ;
561561
562- let mut spans = idxs
562+ let spans = idxs
563563 . iter ( )
564564 . map ( |i| parent. field_name_span ( * i as usize ) . resolve ( db) ) ;
565565
566566 let kind = parent. kind_name ( ) ;
567567 let message = if let Some ( name) = parent. name ( db) {
568568 format ! ( "duplicate field name in {kind} `{name}`" )
569569 } else {
570- "duplicate field name in {kind} definition" . into ( )
570+ format ! ( "duplicate field name in {kind} definition" )
571571 } ;
572572
573573 CompleteDiagnostic {
574574 severity : Severity :: Error ,
575575 message,
576- sub_diagnostics : {
577- let mut subs = vec ! [ SubDiagnostic :: new(
578- LabelStyle :: Primary ,
579- format!( "`{name}` is defined here" ) ,
580- spans. next( ) . unwrap( ) ,
581- ) ] ;
582- subs. extend ( spans. map ( |span| {
583- SubDiagnostic :: new (
584- LabelStyle :: Secondary ,
585- format ! { "`{name}` is redefined here" } ,
586- span,
587- )
588- } ) ) ;
589- subs
590- } ,
576+ sub_diagnostics : duplicate_name_subdiags ( name, spans) ,
591577 notes : vec ! [ ] ,
592578 error_code,
593579 }
@@ -604,7 +590,7 @@ impl<'db> DiagnosticVoucher<'db> for TyLowerDiag<'db> {
604590 . name
605591 . unwrap ( )
606592 . data ( db) ;
607- let mut spans = idxs. iter ( ) . map ( |i| {
593+ let spans = idxs. iter ( ) . map ( |i| {
608594 enum_
609595 . lazy_span ( )
610596 . variants ( )
@@ -614,21 +600,35 @@ impl<'db> DiagnosticVoucher<'db> for TyLowerDiag<'db> {
614600 CompleteDiagnostic {
615601 severity : Severity :: Error ,
616602 message,
617- sub_diagnostics : {
618- let mut subs = vec ! [ SubDiagnostic :: new(
619- LabelStyle :: Primary ,
620- format!( "`{name}` is defined here" ) ,
621- spans. next( ) . unwrap( ) ,
622- ) ] ;
623- subs. extend ( spans. map ( |span| {
624- SubDiagnostic :: new (
625- LabelStyle :: Secondary ,
626- format ! { "`{name}` is redefined here" } ,
627- span,
628- )
629- } ) ) ;
630- subs
631- } ,
603+ sub_diagnostics : duplicate_name_subdiags ( name, spans) ,
604+ notes : vec ! [ ] ,
605+ error_code,
606+ }
607+ }
608+
609+ Self :: DuplicateGenericParamName ( adt, idxs) => {
610+ let message = if let Some ( name) = adt. name ( db) {
611+ format ! (
612+ "duplicate generic parameter name in {} `{}`" ,
613+ adt. kind_name( ) ,
614+ name. data( db)
615+ )
616+ } else {
617+ format ! (
618+ "duplicate generic parameter name in {} definition" ,
619+ adt. kind_name( )
620+ )
621+ } ;
622+
623+ let gen = adt. generic_owner ( ) . unwrap ( ) ;
624+ let name = gen. params ( db) . data ( db) [ 0 ] . name ( ) . unwrap ( ) . data ( db) ;
625+ let spans = idxs
626+ . iter ( )
627+ . map ( |i| gen. params_span ( ) . param ( * i as usize ) . resolve ( db) ) ;
628+ CompleteDiagnostic {
629+ severity : Severity :: Error ,
630+ message,
631+ sub_diagnostics : duplicate_name_subdiags ( name, spans) ,
632632 notes : vec ! [ ] ,
633633 error_code,
634634 }
@@ -736,6 +736,26 @@ impl<'db> DiagnosticVoucher<'db> for TyLowerDiag<'db> {
736736 }
737737}
738738
739+ fn duplicate_name_subdiags < I > ( name : & str , spans : I ) -> Vec < SubDiagnostic >
740+ where
741+ I : Iterator < Item = Option < Span > > ,
742+ {
743+ let mut spans = spans;
744+ let mut subs = vec ! [ SubDiagnostic :: new(
745+ LabelStyle :: Primary ,
746+ format!( "`{}` is defined here" , name) ,
747+ spans. next( ) . unwrap( ) ,
748+ ) ] ;
749+ subs. extend ( spans. map ( |span| {
750+ SubDiagnostic :: new (
751+ LabelStyle :: Secondary ,
752+ format ! ( "`{}` is redefined here" , name) ,
753+ span,
754+ )
755+ } ) ) ;
756+ subs
757+ }
758+
739759impl < ' db > DiagnosticVoucher < ' db > for BodyDiag < ' db > {
740760 fn to_complete ( & self , db : & ' db dyn SpannedHirAnalysisDb ) -> CompleteDiagnostic {
741761 let error_code = GlobalErrorCode :: new ( DiagnosticPass :: TyCheck , self . local_code ( ) ) ;
0 commit comments