diff --git a/crates/oxc_linter/src/generated/rule_runner_impls.rs b/crates/oxc_linter/src/generated/rule_runner_impls.rs index ac0d369e56..257dfa1f9c 100644 --- a/crates/oxc_linter/src/generated/rule_runner_impls.rs +++ b/crates/oxc_linter/src/generated/rule_runner_impls.rs @@ -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; } diff --git a/crates/oxc_linter/src/rules/unicorn/prefer_set_size.rs b/crates/oxc_linter/src/rules/unicorn/prefer_set_size.rs index e30b64e939..ec68fd6391 100644 --- a/crates/oxc_linter/src/rules/unicorn/prefer_set_size.rs +++ b/crates/oxc_linter/src/rules/unicorn/prefer_set_size.rs @@ -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", diff --git a/tasks/track_linter_timings/linter_timings.snap b/tasks/track_linter_timings/linter_timings.snap index bce496c3f0..c9c5333831 100644 --- a/tasks/track_linter_timings/linter_timings.snap +++ b/tasks/track_linter_timings/linter_timings.snap @@ -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