From 8705a291e21ffed153de57380a27f05d45bdaa19 Mon Sep 17 00:00:00 2001 From: Dunqing <29533304+Dunqing@users.noreply.github.com> Date: Thu, 5 Dec 2024 13:52:58 +0000 Subject: [PATCH] feat(transformer/var-declaration): add a series of `create_var*` methods (#7665) part of #7666. These methods aim to combine generate binding and insert var into one method. --- .../src/common/var_declarations.rs | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/crates/oxc_transformer/src/common/var_declarations.rs b/crates/oxc_transformer/src/common/var_declarations.rs index 66fb24af9e44c..5d0b08220d78a 100644 --- a/crates/oxc_transformer/src/common/var_declarations.rs +++ b/crates/oxc_transformer/src/common/var_declarations.rs @@ -20,7 +20,9 @@ use oxc_allocator::Vec as ArenaVec; use oxc_ast::ast::*; use oxc_data_structures::stack::SparseStack; use oxc_span::SPAN; -use oxc_traverse::{Ancestor, BoundIdentifier, Traverse, TraverseCtx}; +use oxc_traverse::{ + ast_operations::GatherNodeParts, Ancestor, BoundIdentifier, Traverse, TraverseCtx, +}; use crate::TransformCtx; @@ -96,6 +98,46 @@ impl<'a> VarDeclarationsStore<'a> { self.insert_var_binding_pattern(pattern, init, ctx); } + /// Create a new [`BoundIdentifier`], add a var declaration to be inserted at the top of + /// the current enclosing statement block, and then return the [`BoundIdentifier`]. + #[inline] + #[expect(unused)] + pub fn create_var(&self, name: &str, ctx: &mut TraverseCtx<'a>) -> BoundIdentifier<'a> { + let binding = ctx.generate_uid_in_current_hoist_scope(name); + self.insert_var(&binding, None, ctx); + binding + } + + /// Create a new [`BoundIdentifier`], add a var declaration with the given init expression + /// to be inserted at the top of the current enclosing statement block, and then return + /// the [`BoundIdentifier`]. + #[inline] + #[expect(unused)] + pub fn create_var_with_init( + &self, + name: &str, + expression: Expression<'a>, + ctx: &mut TraverseCtx<'a>, + ) -> BoundIdentifier<'a> { + let binding = ctx.generate_uid_in_current_hoist_scope(name); + self.insert_var(&binding, Some(expression), ctx); + binding + } + + /// Create a new [`BoundIdentifier`] based on node, add a var declaration to be inserted + /// at the top of the current enclosing statement block, and then return the [`BoundIdentifier`]. + #[inline] + #[expect(unused)] + pub fn create_var_based_on_node>( + &self, + node: &N, + ctx: &mut TraverseCtx<'a>, + ) -> BoundIdentifier<'a> { + let binding = ctx.generate_uid_in_current_hoist_scope_based_on_node(node); + self.insert_var(&binding, None, ctx); + binding + } + /// Add a `let` declaration to be inserted at top of current enclosing statement block, /// given a `BoundIdentifier`. pub fn insert_let(