Skip to content

Commit 2761300

Browse files
committed
refactor(linter): include tsgolint suggestion for Message::from_tsgo_lint_diagnostic (#13255)
1 parent 30c54a3 commit 2761300

File tree

1 file changed

+124
-6
lines changed

1 file changed

+124
-6
lines changed

crates/oxc_linter/src/tsgolint.rs

Lines changed: 124 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)