Skip to content

Commit

Permalink
perf(linter): reduce iterations and allocations in Fixer
Browse files Browse the repository at this point in the history
  • Loading branch information
DonIsaac committed Aug 28, 2024
1 parent 7bb3ecb commit 139db7a
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions crates/oxc_linter/src/fixer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,16 +236,6 @@ impl<'a> Message<'a> {
};
Self { error, span: Span::new(start, end), fix, fixed: false }
}

#[inline]
pub fn start(&self) -> u32 {
self.span.start
}

#[inline]
pub fn end(&self) -> u32 {
self.span.end
}
}

impl From<Message<'_>> for OxcDiagnostic {
Expand Down Expand Up @@ -289,15 +279,25 @@ impl<'a> Fixer<'a> {
let mut fixed = false;
let mut output = String::with_capacity(source_text.len());
let mut last_pos: i64 = -1;
self.messages.iter_mut().filter(|m| m.fix.is_some()).for_each(|m| {
let Fix { content, span } = m.fix.as_ref().unwrap();

// only keep messages that were not fixed
let mut filtered_messages = Vec::with_capacity(self.messages.len());

for mut m in self.messages {
let Some(Fix { content, span }) = m.fix.as_ref() else {
filtered_messages.push(m);
continue;
};
let start = span.start;
let end = span.end;
debug_assert!(start <= end, "Negative range is invalid: {span:?}");
if start > end {
return;
filtered_messages.push(m);
continue;
}
if i64::from(start) < last_pos {
return;
filtered_messages.push(m);
continue;
}

m.fixed = true;
Expand All @@ -306,14 +306,13 @@ impl<'a> Fixer<'a> {
output.push_str(&source_text[offset..start as usize]);
output.push_str(content);
last_pos = i64::from(end);
});
}

let offset = usize::try_from(last_pos.max(0)).ok().unwrap();
output.push_str(&source_text[offset..]);

let mut messages = self.messages.into_iter().filter(|m| !m.fixed).collect::<Vec<_>>();
messages.sort_by_key(|m| m.span);
FixResult { fixed, fixed_code: Cow::Owned(output), messages }
filtered_messages.sort_unstable_by_key(GetSpan::span);
FixResult { fixed, fixed_code: Cow::Owned(output), messages: filtered_messages }
}
}

Expand Down Expand Up @@ -444,6 +443,7 @@ mod test {
}

#[test]
#[should_panic = "Negative range is invalid"]
fn ignore_reverse_range() {
let result = get_fix_result(vec![create_message(reverse_range(), Some(REVERSE_RANGE))]);
assert_eq!(result.fixed_code, TEST_CODE);
Expand Down

0 comments on commit 139db7a

Please sign in to comment.