Skip to content

Commit b34e876

Browse files
authoredApr 5, 2025··
perf(linter): avoid cloning filters by refactoring functions to take references (#10247)
1 parent 7c54ea1 commit b34e876

File tree

3 files changed

+18
-22
lines changed

3 files changed

+18
-22
lines changed
 

‎apps/oxlint/src/lint.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ impl Runner for LintRunner {
6969
let provided_path_count = paths.len();
7070
let now = Instant::now();
7171

72-
let filter = match Self::get_filters(filter) {
73-
Ok(filter) => filter,
72+
let filters = match Self::get_filters(filter) {
73+
Ok(filters) => filters,
7474
Err((result, message)) => {
7575
stdout.write_all(message.as_bytes()).or_else(Self::check_for_writer_error).unwrap();
7676
stdout.flush().unwrap();
@@ -215,8 +215,8 @@ impl Runner for LintRunner {
215215
return CliRunResult::InvalidOptionConfig;
216216
}
217217
}
218-
// TODO(perf): figure out if we can avoid cloning `filter`
219-
.with_filters(filter.clone());
218+
.with_filters(&filters);
219+
220220
match builder.build() {
221221
Ok(config) => nested_configs.insert(dir.to_path_buf(), config),
222222
Err(diagnostic) => {
@@ -259,7 +259,7 @@ impl Runner for LintRunner {
259259
return CliRunResult::InvalidOptionConfig;
260260
}
261261
}
262-
.with_filters(filter);
262+
.with_filters(&filters);
263263

264264
if let Some(basic_config_file) = oxlintrc_for_print {
265265
let config_file = config_builder.resolve_final_config_file(basic_config_file);

‎crates/oxc_language_server/src/linter/server_linter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ mod test {
4747
#[test]
4848
fn test_no_console() {
4949
let config_store = ConfigStoreBuilder::default()
50-
.with_filter(LintFilter::deny(LintFilterKind::parse("no-console".into()).unwrap()))
50+
.with_filter(&LintFilter::deny(LintFilterKind::parse("no-console".into()).unwrap()))
5151
.build()
5252
.unwrap();
5353
let linter = Linter::new(LintOptions::default(), config_store).with_fix(FixKind::SafeFix);

‎crates/oxc_linter/src/config/config_builder.rs

+12-16
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ impl ConfigStoreBuilder {
109109
let cache = RulesCache::new(config.plugins);
110110
let mut builder = Self { rules, config, overrides, cache };
111111

112-
if !categories.is_empty() {
113-
builder = builder.with_filters(categories.filters());
112+
for filter in categories.filters() {
113+
builder = builder.with_filter(&filter);
114114
}
115115

116116
{
@@ -227,20 +227,20 @@ impl ConfigStoreBuilder {
227227
self
228228
}
229229

230-
pub fn with_filters<I: IntoIterator<Item = LintFilter>>(mut self, filters: I) -> Self {
230+
pub fn with_filters<'a, I: IntoIterator<Item = &'a LintFilter>>(mut self, filters: I) -> Self {
231231
for filter in filters {
232232
self = self.with_filter(filter);
233233
}
234234
self
235235
}
236236

237-
pub fn with_filter(mut self, filter: LintFilter) -> Self {
237+
pub fn with_filter(mut self, filter: &LintFilter) -> Self {
238238
let (severity, filter) = filter.into();
239239

240240
match severity {
241241
AllowWarnDeny::Deny | AllowWarnDeny::Warn => match filter {
242242
LintFilterKind::Category(category) => {
243-
self.upsert_where(severity, |r| r.category() == category);
243+
self.upsert_where(severity, |r| r.category() == *category);
244244
}
245245
LintFilterKind::Rule(_, name) => self.upsert_where(severity, |r| r.name() == name),
246246
LintFilterKind::Generic(name_or_category) => {
@@ -253,7 +253,7 @@ impl ConfigStoreBuilder {
253253
},
254254
AllowWarnDeny::Allow => match filter {
255255
LintFilterKind::Category(category) => {
256-
self.rules.retain(|rule| rule.category() != category);
256+
self.rules.retain(|rule| rule.category() != *category);
257257
}
258258
LintFilterKind::Rule(_, name) => {
259259
self.rules.retain(|rule| rule.name() != name);
@@ -537,7 +537,7 @@ mod test {
537537
let builder = ConfigStoreBuilder::default();
538538
let initial_rule_count = builder.rules.len();
539539

540-
let builder = builder.with_filters([LintFilter::deny(RuleCategory::Correctness)]);
540+
let builder = builder.with_filter(&LintFilter::deny(RuleCategory::Correctness));
541541
let rule_count_after_deny = builder.rules.len();
542542

543543
// By default, all correctness rules are set to warn. the above filter should only
@@ -566,8 +566,7 @@ mod test {
566566
let initial_rule_count = builder.rules.len();
567567

568568
let builder =
569-
builder
570-
.with_filters([LintFilter::new(AllowWarnDeny::Deny, filter_string).unwrap()]);
569+
builder.with_filter(&LintFilter::new(AllowWarnDeny::Deny, filter_string).unwrap());
571570
let rule_count_after_deny = builder.rules.len();
572571
assert_eq!(
573572
initial_rule_count, rule_count_after_deny,
@@ -591,7 +590,7 @@ mod test {
591590
let builder = ConfigStoreBuilder::default();
592591
// sanity check: not already turned on
593592
assert!(!builder.rules.iter().any(|r| r.name() == "no-console"));
594-
let builder = builder.with_filter(filter);
593+
let builder = builder.with_filter(&filter);
595594
let no_console = builder
596595
.rules
597596
.iter()
@@ -604,14 +603,11 @@ mod test {
604603

605604
#[test]
606605
fn test_filter_allow_all_then_warn() {
607-
let builder = ConfigStoreBuilder::default().with_filters([LintFilter::new(
608-
AllowWarnDeny::Allow,
609-
"all",
610-
)
611-
.unwrap()]);
606+
let builder = ConfigStoreBuilder::default()
607+
.with_filter(&LintFilter::new(AllowWarnDeny::Allow, "all").unwrap());
612608
assert!(builder.rules.is_empty(), "Allowing all rules should empty out the rules list");
613609

614-
let builder = builder.with_filters([LintFilter::warn(RuleCategory::Correctness)]);
610+
let builder = builder.with_filter(&LintFilter::warn(RuleCategory::Correctness));
615611
assert!(
616612
!builder.rules.is_empty(),
617613
"warning on categories after allowing all rules should populate the rules set"

0 commit comments

Comments
 (0)
Please sign in to comment.