diff --git a/crates/oxc_linter/src/fixer/mod.rs b/crates/oxc_linter/src/fixer/mod.rs index 43f1a4b095ebf..d6e04f40d8e4b 100644 --- a/crates/oxc_linter/src/fixer/mod.rs +++ b/crates/oxc_linter/src/fixer/mod.rs @@ -100,7 +100,7 @@ impl<'c, 'a: 'c> RuleFixer<'c, 'a> { let target_text = fixer.possibly_truncate_range(target); let borrowed_replacement = Cow::Borrowed(replacement_text); let replacement_text = fixer.possibly_truncate_snippet(&borrowed_replacement); - Cow::Owned(format!("Replace `{target_text}` with `{replacement_text}`.")) + Cow::Owned(format_replace_message(target_text.as_ref(), replacement_text.as_ref())) }); fixer.new_fix(CompositeFix::Single(fix), message) @@ -119,9 +119,9 @@ impl<'c, 'a: 'c> RuleFixer<'c, 'a> { let fix = Fix::new(replacement, target); let target_text = fixer.possibly_truncate_range(target); let content = fixer.possibly_truncate_snippet(&fix.content); - let message = fixer - .auto_message - .then(|| Cow::Owned(format!("Replace `{target_text}` with `{content}`."))); + let message = fixer.auto_message.then(|| { + Cow::Owned(format_replace_message(target_text.as_ref(), content.as_ref())) + }); fixer.new_fix(CompositeFix::Single(fix), message) } @@ -224,6 +224,14 @@ impl<'c, 'a: 'c> RuleFixer<'c, 'a> { } } +fn format_replace_message(target_text: &str, replacement_text: &str) -> String { + if replacement_text.is_empty() { + format!("Remove `{target_text}`.") + } else { + format!("Replace `{target_text}` with `{replacement_text}`.") + } +} + #[derive(Debug)] pub struct FixResult<'a> { pub fixed: bool, @@ -452,7 +460,9 @@ mod test { use crate::FixKind; - use super::{CompositeFix, Fix, FixResult, Fixer, Message, PossibleFixes}; + use super::{ + CompositeFix, Fix, FixResult, Fixer, Message, PossibleFixes, format_replace_message, + }; fn insert_at_end() -> OxcDiagnostic { OxcDiagnostic::warn("End") @@ -950,4 +960,14 @@ mod test { assert!(result.fixed); assert_eq!(result.fixed_code, "let answer = 42;"); } + + #[test] + fn format_replace_message_for_non_empty_replacement() { + assert_eq!(format_replace_message("{foo}", "bar"), "Replace `{foo}` with `bar`."); + } + + #[test] + fn format_replace_message_for_empty_replacement() { + assert_eq!(format_replace_message(r#"{""}"#, ""), r#"Remove `{""}`."#); + } } diff --git a/crates/oxc_linter/src/snapshots/react_jsx_curly_brace_presence.snap b/crates/oxc_linter/src/snapshots/react_jsx_curly_brace_presence.snap index 1a1bb44bc8a68..7c453f49f1b4e 100644 --- a/crates/oxc_linter/src/snapshots/react_jsx_curly_brace_presence.snap +++ b/crates/oxc_linter/src/snapshots/react_jsx_curly_brace_presence.snap @@ -510,4 +510,4 @@ source: crates/oxc_linter/src/tester.rs 1 │ {""} · ── ╰──── - help: Replace `{""}` with ``. + help: Remove `{""}`. diff --git a/crates/oxc_linter/src/snapshots/react_jsx_no_useless_fragment.snap b/crates/oxc_linter/src/snapshots/react_jsx_no_useless_fragment.snap index 8a8d6f4cc4619..55f78104aa02b 100644 --- a/crates/oxc_linter/src/snapshots/react_jsx_no_useless_fragment.snap +++ b/crates/oxc_linter/src/snapshots/react_jsx_no_useless_fragment.snap @@ -167,7 +167,7 @@ source: crates/oxc_linter/src/tester.rs · ────────────────── 5 │ ╰──── - help: Replace `` with ``. + help: Remove ``. ⚠ eslint-plugin-react(jsx-no-useless-fragment): Passing a fragment to a HTML element is useless. ╭─[jsx_no_useless_fragment.tsx:4:17] @@ -176,7 +176,7 @@ source: crates/oxc_linter/src/tester.rs · ────────────────── 5 │ ╰──── - help: Replace `` with ``. + help: Remove ``. ⚠ eslint-plugin-react(jsx-no-useless-fragment): Fragments should contain more than one child. ╭─[jsx_no_useless_fragment.tsx:1:1]