11use std:: {
2+ borrow:: Cow ,
23 collections:: BTreeSet ,
34 ffi:: OsStr ,
45 io:: { ErrorKind , Read , Write } ,
6+ mem,
57 path:: { Path , PathBuf } ,
68 sync:: Arc ,
79} ;
@@ -598,16 +600,16 @@ impl From<TsGoLintDiagnostic> for OxcDiagnostic {
598600#[ cfg( feature = "language_server" ) ]
599601impl Message < ' _ > {
600602 /// Converts a `TsGoLintDiagnostic` into a `Message` with possible fixes.
601- fn from_tsgo_lint_diagnostic ( val : TsGoLintDiagnostic , source_text : & str ) -> Self {
603+ fn from_tsgo_lint_diagnostic ( mut val : TsGoLintDiagnostic , source_text : & str ) -> Self {
602604 let mut fixes =
603605 Vec :: with_capacity ( usize:: from ( !val. fixes . is_empty ( ) ) + val. suggestions . len ( ) ) ;
604606
605607 if !val. fixes . is_empty ( ) {
606- let fix_vec = val
607- . fixes
608- . iter ( )
608+ let fix_vec = mem :: take ( & mut val. fixes ) ;
609+ let fix_vec = fix_vec
610+ . into_iter ( )
609611 . map ( |fix| crate :: fixer:: Fix {
610- content : fix. text . clone ( ) . into ( ) ,
612+ content : Cow :: Owned ( fix. text ) ,
611613 span : Span :: new ( fix. range . pos , fix. range . end ) ,
612614 message : None ,
613615 } )
@@ -616,19 +618,31 @@ impl Message<'_> {
616618 fixes. push ( CompositeFix :: merge_fixes ( fix_vec, source_text) ) ;
617619 }
618620
619- for suggestion in & val. suggestions {
621+ let suggestions = mem:: take ( & mut val. suggestions ) ;
622+ fixes. extend ( suggestions. into_iter ( ) . map ( |mut suggestion| {
623+ let last_fix_index = suggestion. fixes . len ( ) . wrapping_sub ( 1 ) ;
620624 let fix_vec = suggestion
621625 . fixes
622- . iter ( )
623- . map ( |fix| crate :: fixer:: Fix {
624- content : fix. text . clone ( ) . into ( ) ,
625- span : Span :: new ( fix. range . pos , fix. range . end ) ,
626- message : Some ( suggestion. message . description . clone ( ) . into ( ) ) ,
626+ . into_iter ( )
627+ . enumerate ( )
628+ . map ( |( i, fix) | {
629+ // Don't clone the message description on last turn of loop
630+ let message = if i < last_fix_index {
631+ suggestion. message . description . clone ( )
632+ } else {
633+ mem:: take ( & mut suggestion. message . description )
634+ } ;
635+
636+ crate :: fixer:: Fix {
637+ content : Cow :: Owned ( fix. text ) ,
638+ span : Span :: new ( fix. range . pos , fix. range . end ) ,
639+ message : Some ( Cow :: Owned ( message) ) ,
640+ }
627641 } )
628642 . collect ( ) ;
629643
630- fixes . push ( CompositeFix :: merge_fixes ( fix_vec, source_text) ) ;
631- }
644+ CompositeFix :: merge_fixes ( fix_vec, source_text)
645+ } ) ) ;
632646
633647 let possible_fix = if fixes. is_empty ( ) {
634648 PossibleFixes :: None
0 commit comments