From da2b2a4060454de6b4bfe904aab054bf0ed0b766 Mon Sep 17 00:00:00 2001 From: overlookmotel <557937+overlookmotel@users.noreply.github.com> Date: Tue, 1 Oct 2024 08:41:45 +0000 Subject: [PATCH] perf(transformer): look up `SymbolId` for `require` only once (#6192) When inserting `var x = require('y');` statements in `ModuleImports`, look up the binding for `require` only once, rather than for each statement. --- .../src/common/module_imports.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/crates/oxc_transformer/src/common/module_imports.rs b/crates/oxc_transformer/src/common/module_imports.rs index 123bcc495..f53856a80 100644 --- a/crates/oxc_transformer/src/common/module_imports.rs +++ b/crates/oxc_transformer/src/common/module_imports.rs @@ -85,7 +85,14 @@ impl<'a, 'ctx> ModuleImports<'a, 'ctx> { imports: &mut IndexMap, Vec>>, ctx: &mut TraverseCtx<'a>, ) { - let stmts = imports.drain(..).map(|(source, names)| Self::get_require(source, names, ctx)); + if imports.is_empty() { + return; + } + + let require_symbol_id = ctx.scopes().get_root_binding("require"); + let stmts = imports + .drain(..) + .map(|(source, names)| Self::get_require(source, names, require_symbol_id, ctx)); self.ctx.top_level_statements.insert_statements(stmts); } @@ -116,12 +123,16 @@ impl<'a, 'ctx> ModuleImports<'a, 'ctx> { fn get_require( source: Atom<'a>, names: std::vec::Vec>, + require_symbol_id: Option, ctx: &mut TraverseCtx<'a>, ) -> Statement<'a> { let var_kind = VariableDeclarationKind::Var; - let symbol_id = ctx.scopes().get_root_binding("require"); - let ident = - ctx.create_reference_id(SPAN, Atom::from("require"), symbol_id, ReferenceFlags::read()); + let ident = ctx.create_reference_id( + SPAN, + Atom::from("require"), + require_symbol_id, + ReferenceFlags::read(), + ); let callee = ctx.ast.expression_from_identifier_reference(ident); let args = {