Skip to content

Commit 805332f

Browse files
committed
perf(linter): reduce string cloning in tsgo fixes
1 parent c94c5dc commit 805332f

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

crates/oxc_linter/src/tsgolint.rs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use 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")]
599601
impl 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

Comments
 (0)