@@ -372,10 +372,11 @@ impl Message<'_> {
372372 /// Converts a `TsGoLintDiagnostic` into a `Message` with possible fixes.
373373 #[ cfg( test) ]
374374 fn from_tsgo_lint_diagnostic ( val : TsGoLintDiagnostic , source_text : & str ) -> Self {
375- let possible_fix = if val. fixes . is_empty ( ) {
376- PossibleFixes :: None
377- } else {
378- let fixes = val
375+ let mut fixes =
376+ Vec :: with_capacity ( usize:: from ( !val. fixes . is_empty ( ) ) + val. suggestions . len ( ) ) ;
377+
378+ if !val. fixes . is_empty ( ) {
379+ let fix_vec = val
379380 . fixes
380381 . iter ( )
381382 . map ( |fix| crate :: fixer:: Fix {
@@ -384,7 +385,30 @@ impl Message<'_> {
384385 message : None ,
385386 } )
386387 . collect ( ) ;
387- PossibleFixes :: Single ( CompositeFix :: merge_fixes ( fixes, source_text) )
388+
389+ fixes. push ( CompositeFix :: merge_fixes ( fix_vec, source_text) ) ;
390+ }
391+
392+ for suggestion in & val. suggestions {
393+ let fix_vec = suggestion
394+ . fixes
395+ . iter ( )
396+ . map ( |fix| crate :: fixer:: Fix {
397+ content : fix. text . clone ( ) . into ( ) ,
398+ span : Span :: new ( fix. range . pos , fix. range . end ) ,
399+ message : Some ( suggestion. message . description . clone ( ) . into ( ) ) ,
400+ } )
401+ . collect ( ) ;
402+
403+ fixes. push ( CompositeFix :: merge_fixes ( fix_vec, source_text) ) ;
404+ }
405+
406+ let possible_fix = if fixes. is_empty ( ) {
407+ PossibleFixes :: None
408+ } else if fixes. len ( ) == 1 {
409+ PossibleFixes :: Single ( fixes. into_iter ( ) . next ( ) . unwrap ( ) )
410+ } else {
411+ PossibleFixes :: Multiple ( fixes)
388412 } ;
389413
390414 Self :: new ( val. into ( ) , possible_fix)
@@ -516,7 +540,7 @@ mod test {
516540
517541 use crate :: {
518542 fixer:: { Message , PossibleFixes } ,
519- tsgolint:: { Fix , MessageType , Range , RuleMessage , TsGoLintDiagnostic } ,
543+ tsgolint:: { Fix , MessageType , Range , RuleMessage , Suggestion , TsGoLintDiagnostic } ,
520544 } ;
521545
522546 /// Implements `PartialEq` for `PossibleFixes` to enable equality assertions in tests.
@@ -597,4 +621,98 @@ mod test {
597621 } )
598622 ) ;
599623 }
624+
625+ #[ test]
626+ fn test_message_from_tsgo_lint_diagnostic_with_multiple_suggestions ( ) {
627+ let diagnostic = TsGoLintDiagnostic {
628+ r#type : MessageType :: Diagnostic ,
629+ range : Range { pos : 0 , end : 10 } ,
630+ rule : "some_rule" . into ( ) ,
631+ message : RuleMessage {
632+ id : "some_id" . into ( ) ,
633+ description : "Some description" . into ( ) ,
634+ help : None ,
635+ } ,
636+ fixes : vec ! [ ] ,
637+ suggestions : vec ! [
638+ Suggestion {
639+ message: RuleMessage {
640+ id: "some_id" . into( ) ,
641+ description: "Suggestion 1" . into( ) ,
642+ help: None ,
643+ } ,
644+ fixes: vec![ Fix { text: "hello" . into( ) , range: Range { pos: 0 , end: 5 } } ] ,
645+ } ,
646+ Suggestion {
647+ message: RuleMessage {
648+ id: "some_id" . into( ) ,
649+ description: "Suggestion 2" . into( ) ,
650+ help: None ,
651+ } ,
652+ fixes: vec![
653+ Fix { text: "hello" . into( ) , range: Range { pos: 0 , end: 5 } } ,
654+ Fix { text: "world" . into( ) , range: Range { pos: 5 , end: 10 } } ,
655+ ] ,
656+ } ,
657+ ] ,
658+ file_path : "some/file/path" . into ( ) ,
659+ } ;
660+
661+ let message = Message :: from_tsgo_lint_diagnostic ( diagnostic, "Some text over 10 bytes." ) ;
662+
663+ assert_eq ! (
664+ message. fixes,
665+ PossibleFixes :: Multiple ( vec![
666+ crate :: fixer:: Fix {
667+ content: "hello" . into( ) ,
668+ span: Span :: new( 0 , 5 ) ,
669+ message: Some ( "Suggestion 1" . into( ) ) ,
670+ } ,
671+ crate :: fixer:: Fix {
672+ content: "helloworld" . into( ) ,
673+ span: Span :: new( 0 , 10 ) ,
674+ message: Some ( "Suggestion 2" . into( ) ) ,
675+ } ,
676+ ] )
677+ ) ;
678+ }
679+
680+ #[ test]
681+ fn test_message_from_tsgo_lint_diagnostic_with_fix_and_suggestions ( ) {
682+ let diagnostic = TsGoLintDiagnostic {
683+ r#type : MessageType :: Diagnostic ,
684+ range : Range { pos : 0 , end : 10 } ,
685+ rule : "some_rule" . into ( ) ,
686+ message : RuleMessage {
687+ id : "some_id" . into ( ) ,
688+ description : "Some description" . into ( ) ,
689+ help : None ,
690+ } ,
691+ fixes : vec ! [ Fix { text: "fixed" . into( ) , range: Range { pos: 0 , end: 5 } } ] ,
692+ suggestions : vec ! [ Suggestion {
693+ message: RuleMessage {
694+ id: "some_id" . into( ) ,
695+ description: "Suggestion 1" . into( ) ,
696+ help: None ,
697+ } ,
698+ fixes: vec![ Fix { text: "Suggestion 1" . into( ) , range: Range { pos: 0 , end: 5 } } ] ,
699+ } ] ,
700+ file_path : "some/file/path" . into ( ) ,
701+ } ;
702+
703+ let message = Message :: from_tsgo_lint_diagnostic ( diagnostic, "Some text over 10 bytes." ) ;
704+
705+ assert_eq ! ( message. fixes. len( ) , 2 ) ;
706+ assert_eq ! (
707+ message. fixes,
708+ PossibleFixes :: Multiple ( vec![
709+ crate :: fixer:: Fix { content: "fixed" . into( ) , span: Span :: new( 0 , 5 ) , message: None } ,
710+ crate :: fixer:: Fix {
711+ content: "Suggestion 1" . into( ) ,
712+ span: Span :: new( 0 , 5 ) ,
713+ message: Some ( "Suggestion 1" . into( ) ) ,
714+ } ,
715+ ] )
716+ ) ;
717+ }
600718}
0 commit comments