perf(linter/unicorn/prefer-set-size): narrow AST dispatch (#28364)

Start from spreads and calls rather than every static member expression,
retaining conversion, binding, and comment checks. Reduce fixture
callbacks from 76,337 to 63,060.


---

<sub>Stack created with <a
href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a
href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Cam McHenryandCopilot authored and GitHub committed 2026-10-28 22:28:49 -04:00
1 parent a777fa6552
commit a86158be60
3 files changed
+22 -4

No files matched your search

+1 -1
View File
@@ -3920,7 +3920,7 @@ impl RuleRunner for crate::rules::unicorn::prefer_set_has::PreferSetHas {
impl RuleRunner for crate::rules::unicorn::prefer_set_size::PreferSetSize {
const NODE_TYPES: Option<&AstTypesBitset> =
Some(&AstTypesBitset::from_types(&[AstType::StaticMemberExpression]));
Some(&AstTypesBitset::from_types(&[AstType::CallExpression, AstType::SpreadElement]));
const RUN_FUNCTIONS: RuleRunFunctionsImplemented = RuleRunFunctionsImplemented::Run;
}
@@ -10,7 +10,7 @@ use oxc_span::{GetSpan, Span};
use crate::{
AstNode,
ast_util::variable_declaration_kind,
ast_util::{get_declaration_of_variable, is_method_call},
ast_util::{get_declaration_of_variable, is_method_call, outermost_paren_parent},
context::LintContext,
fixer::Fix,
rule::Rule,
@@ -57,7 +57,21 @@ declare_oxc_lint!(
impl Rule for PreferSetSize {
fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {
let AstKind::StaticMemberExpression(member_expr) = node.kind() else {
let conversion_node = match node.kind() {
AstKind::SpreadElement(_) => {
let parent = ctx.nodes().parent_node(node.id());
if !matches!(parent.kind(), AstKind::ArrayExpression(_)) {
return;
}
parent
}
AstKind::CallExpression(_) => node,
_ => return,
};
let Some(parent) = outermost_paren_parent(conversion_node, ctx) else {
return;
};
let AstKind::StaticMemberExpression(member_expr) = parent.kind() else {
return;
};
@@ -165,6 +179,10 @@ fn test() {
let pass = vec![
"new Set(foo).size",
"[...new Set(array), ...new Set(other)].length",
"foo(...new Set(array)).length",
"({...new Set(array)}).length",
"[...[...new Set(array)]].length",
"for (const foo of bar) console.log([...foo].length)",
"[...new Set(array), foo].length",
"[foo, ...new Set(array), ].length",
@@ -627,7 +627,7 @@ unicorn/prefer-reflect-apply | 62606
unicorn/prefer-regexp-test | 62606
unicorn/prefer-response-static-json | 1421
unicorn/prefer-set-has | 37499
unicorn/prefer-set-size | 76337
unicorn/prefer-set-size | 63060
unicorn/prefer-single-call | 24802
unicorn/prefer-spread | 62606
unicorn/prefer-string-raw | 62460