From 2b334a0f1f0fd041285024c02eba5858f3abcce7 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Tue, 16 Jul 2024 14:10:44 +0800 Subject: [PATCH] perf: improve --- crates/oxc_semantic/src/builder.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index aa2cfef5f36fa..9ffd6ae33d7e1 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -6,7 +6,6 @@ use std::{ sync::Arc, }; -use itertools::Itertools; #[allow(clippy::wildcard_imports)] use oxc_ast::{ast::*, AstKind, Trivias, Visit}; use oxc_cfg::{ @@ -387,19 +386,24 @@ impl<'a> SemanticBuilder<'a> { let parent_refs = iter.nth(self.current_scope_depth - 1).unwrap(); let current_refs = iter.next().unwrap(); - let bindings = self.scope.get_bindings(self.current_scope_id); for (name, mut references) in current_refs.drain() { // Try to resolve a reference. // If unresolved, transfer it to parent scope's unresolved references. + let bindings = self.scope.get_bindings(self.current_scope_id); if let Some(symbol_id) = bindings.get(&name).copied() { let symbol_flag = self.symbols.get_flag(symbol_id); + let resolved_references: &mut Vec<_> = + self.symbols.resolved_references[symbol_id].as_mut(); + // Reserve space for all references to avoid reallocations. + resolved_references.reserve(references.len()); + references.retain(|(id, flag)| { if flag.is_type() && symbol_flag.is_type() || flag.is_value() && symbol_flag.is_value() { self.symbols.references[*id].set_symbol_id(symbol_id); - self.symbols.resolved_references[symbol_id].push(*id); + resolved_references.push(*id); false } else { true