From a777fa65529607d7e825868a71add26a0fd3ef42 Mon Sep 17 00:00:00 2001 From: Cam McHenry Date: Wed, 28 Oct 2026 22:28:49 -0400 Subject: [PATCH] perf(linter/eslint/no-iterator): narrow member dispatch (#28363) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Exclude private-field expressions, whose static property names cannot match. Reduce fixture callbacks from 95,297 to 94,090. --- Stack created with GitHub Stacks CLI • Give Feedback 💬 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- crates/oxc_linter/src/generated/rule_runner_impls.rs | 1 - crates/oxc_linter/src/rules/eslint/no_iterator.rs | 8 ++++++-- tasks/track_linter_timings/linter_timings.snap | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/crates/oxc_linter/src/generated/rule_runner_impls.rs b/crates/oxc_linter/src/generated/rule_runner_impls.rs index 703dd43e9a..ac0d369e56 100644 --- a/crates/oxc_linter/src/generated/rule_runner_impls.rs +++ b/crates/oxc_linter/src/generated/rule_runner_impls.rs @@ -794,7 +794,6 @@ impl RuleRunner for crate::rules::eslint::no_irregular_whitespace::NoIrregularWh impl RuleRunner for crate::rules::eslint::no_iterator::NoIterator { const NODE_TYPES: Option<&AstTypesBitset> = Some(&AstTypesBitset::from_types(&[ AstType::ComputedMemberExpression, - AstType::PrivateFieldExpression, AstType::StaticMemberExpression, ])); const RUN_FUNCTIONS: RuleRunFunctionsImplemented = RuleRunFunctionsImplemented::Run; diff --git a/crates/oxc_linter/src/rules/eslint/no_iterator.rs b/crates/oxc_linter/src/rules/eslint/no_iterator.rs index 4650e96218..e9fa0d00f6 100644 --- a/crates/oxc_linter/src/rules/eslint/no_iterator.rs +++ b/crates/oxc_linter/src/rules/eslint/no_iterator.rs @@ -1,3 +1,4 @@ +use oxc_ast::{AstKind, MemberExpressionKind}; use oxc_diagnostics::OxcDiagnostic; use oxc_macros::declare_oxc_lint; use oxc_span::{GetSpan, Span}; @@ -63,8 +64,10 @@ declare_oxc_lint!( impl Rule for NoIterator { fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) { - let Some(member_expression) = node.kind().as_member_expression_kind() else { - return; + let member_expression = match node.kind() { + AstKind::StaticMemberExpression(expr) => MemberExpressionKind::Static(expr), + AstKind::ComputedMemberExpression(expr) => MemberExpressionKind::Computed(expr), + _ => return, }; if let Some(static_property_name) = member_expression.static_property_name() && static_property_name == "__iterator__" @@ -87,6 +90,7 @@ fn test() { "var __iterator__ = null;", "foo[`__iterator`] = null;", "foo[`__iterator__\n`] = null;", + "class C { #__iterator__; read() { return this.#__iterator__; } }", ]; let fail = vec![ diff --git a/tasks/track_linter_timings/linter_timings.snap b/tasks/track_linter_timings/linter_timings.snap index d145717862..bce496c3f0 100644 --- a/tasks/track_linter_timings/linter_timings.snap +++ b/tasks/track_linter_timings/linter_timings.snap @@ -80,7 +80,7 @@ eslint/no-inline-comments | 7 eslint/no-inner-declarations | 45646 eslint/no-invalid-regexp | 64027 eslint/no-irregular-whitespace | 63961 -eslint/no-iterator | 95297 +eslint/no-iterator | 94090 eslint/no-label-var | 5 eslint/no-labels | 841 eslint/no-lone-blocks | 14946