@@ -629,19 +629,27 @@ impl Diagnostic {
629
629
applicability : Applicability ,
630
630
style : SuggestionStyle ,
631
631
) -> & mut Self {
632
- assert ! ( !suggestion. is_empty( ) ) ;
633
- debug_assert ! (
634
- !( suggestion. iter( ) . any( |( sp, text) | sp. is_empty( ) && text. is_empty( ) ) ) ,
635
- "Span must not be empty and have no suggestion"
632
+ let mut parts = suggestion
633
+ . into_iter ( )
634
+ . map ( |( span, snippet) | SubstitutionPart { snippet, span } )
635
+ . collect :: < Vec < _ > > ( ) ;
636
+
637
+ parts. sort_unstable_by_key ( |part| part. span ) ;
638
+
639
+ assert ! ( !parts. is_empty( ) ) ;
640
+ debug_assert_eq ! (
641
+ parts. iter( ) . find( |part| part. span. is_empty( ) && part. snippet. is_empty( ) ) ,
642
+ None ,
643
+ "Span must not be empty and have no suggestion" ,
644
+ ) ;
645
+ debug_assert_eq ! (
646
+ parts. array_windows( ) . find( |[ a, b] | a. span. overlaps( b. span) ) ,
647
+ None ,
648
+ "suggestion must not have overlapping parts" ,
636
649
) ;
637
650
638
651
self . push_suggestion ( CodeSuggestion {
639
- substitutions : vec ! [ Substitution {
640
- parts: suggestion
641
- . into_iter( )
642
- . map( |( span, snippet) | SubstitutionPart { snippet, span } )
643
- . collect( ) ,
644
- } ] ,
652
+ substitutions : vec ! [ Substitution { parts } ] ,
645
653
msg : self . subdiagnostic_message_to_diagnostic_message ( msg) ,
646
654
style,
647
655
applicability,
@@ -802,25 +810,34 @@ impl Diagnostic {
802
810
suggestions : impl IntoIterator < Item = Vec < ( Span , String ) > > ,
803
811
applicability : Applicability ,
804
812
) -> & mut Self {
805
- let suggestions: Vec < _ > = suggestions. into_iter ( ) . collect ( ) ;
806
- debug_assert ! (
807
- !( suggestions
808
- . iter( )
809
- . flatten( )
810
- . any( |( sp, suggestion) | sp. is_empty( ) && suggestion. is_empty( ) ) ) ,
811
- "Span must not be empty and have no suggestion"
812
- ) ;
813
+ let substitutions = suggestions
814
+ . into_iter ( )
815
+ . map ( |sugg| {
816
+ let mut parts = sugg
817
+ . into_iter ( )
818
+ . map ( |( span, snippet) | SubstitutionPart { snippet, span } )
819
+ . collect :: < Vec < _ > > ( ) ;
820
+
821
+ parts. sort_unstable_by_key ( |part| part. span ) ;
822
+
823
+ assert ! ( !parts. is_empty( ) ) ;
824
+ debug_assert_eq ! (
825
+ parts. iter( ) . find( |part| part. span. is_empty( ) && part. snippet. is_empty( ) ) ,
826
+ None ,
827
+ "Span must not be empty and have no suggestion" ,
828
+ ) ;
829
+ debug_assert_eq ! (
830
+ parts. array_windows( ) . find( |[ a, b] | a. span. overlaps( b. span) ) ,
831
+ None ,
832
+ "suggestion must not have overlapping parts" ,
833
+ ) ;
834
+
835
+ Substitution { parts }
836
+ } )
837
+ . collect ( ) ;
813
838
814
839
self . push_suggestion ( CodeSuggestion {
815
- substitutions : suggestions
816
- . into_iter ( )
817
- . map ( |sugg| Substitution {
818
- parts : sugg
819
- . into_iter ( )
820
- . map ( |( span, snippet) | SubstitutionPart { snippet, span } )
821
- . collect ( ) ,
822
- } )
823
- . collect ( ) ,
840
+ substitutions,
824
841
msg : self . subdiagnostic_message_to_diagnostic_message ( msg) ,
825
842
style : SuggestionStyle :: ShowCode ,
826
843
applicability,
0 commit comments