perf(linter): eslint/no_shadow_restricted_names use run_on_symbol (#5618)

This rule was implemented as a `run_once` method which just iterated over symbols. Implement using `run_on_symbol` instead to avoid the additional iteration.
This commit is contained in:
overlookmotel 2024-09-09 01:07:32 +00:00
parent 0b7fccf000
commit 37e922c00f

View file

@ -2,6 +2,7 @@ use oxc_ast::AstKind;
use oxc_diagnostics::OxcDiagnostic; use oxc_diagnostics::OxcDiagnostic;
use oxc_macros::declare_oxc_lint; use oxc_macros::declare_oxc_lint;
use oxc_span::Span; use oxc_span::Span;
use oxc_syntax::symbol::SymbolId;
use crate::{context::LintContext, globals::PRE_DEFINE_VAR, rule::Rule}; use crate::{context::LintContext, globals::PRE_DEFINE_VAR, rule::Rule};
@ -37,36 +38,34 @@ declare_oxc_lint!(
); );
impl Rule for NoShadowRestrictedNames { impl Rule for NoShadowRestrictedNames {
fn run_once(&self, ctx: &LintContext<'_>) { fn run_on_symbol(&self, symbol_id: SymbolId, ctx: &LintContext<'_>) {
ctx.symbols().iter().for_each(|symbol_id| { let name = ctx.symbols().get_name(symbol_id);
let name = ctx.symbols().get_name(symbol_id);
if !PRE_DEFINE_VAR.contains_key(name) { if !PRE_DEFINE_VAR.contains_key(name) {
return; return;
} }
if name == "undefined" { if name == "undefined" {
// Allow to declare `undefined` variable but not allow to assign value to it. // Allow to declare `undefined` variable but not allow to assign value to it.
let node_id = ctx.semantic().symbols().get_declaration(symbol_id); let node_id = ctx.semantic().symbols().get_declaration(symbol_id);
if let AstKind::VariableDeclarator(declarator) = ctx.nodes().kind(node_id) { if let AstKind::VariableDeclarator(declarator) = ctx.nodes().kind(node_id) {
if declarator.init.is_none() if declarator.init.is_none()
&& ctx && ctx
.symbols() .symbols()
.get_resolved_references(symbol_id) .get_resolved_references(symbol_id)
.all(|reference| !reference.is_write()) .all(|reference| !reference.is_write())
{ {
return; return;
}
} }
} }
}
let span = ctx.symbols().get_span(symbol_id); let span = ctx.symbols().get_span(symbol_id);
ctx.diagnostic(no_shadow_restricted_names_diagnostic(name, span));
for &span in ctx.symbols().get_redeclarations(symbol_id) {
ctx.diagnostic(no_shadow_restricted_names_diagnostic(name, span)); ctx.diagnostic(no_shadow_restricted_names_diagnostic(name, span));
}
for &span in ctx.symbols().get_redeclarations(symbol_id) {
ctx.diagnostic(no_shadow_restricted_names_diagnostic(name, span));
}
});
} }
} }