From 23fb8c5563a8e5f79d256bb27bdbdfd56944ccbc Mon Sep 17 00:00:00 2001 From: magic-akari Date: Thu, 30 Mar 2023 16:41:55 +0800 Subject: [PATCH] fix(es/compat): Fix the position for temp var injection (#7171) --- .../src/es2021/logical_assignments.rs | 20 +++++++++++++++---- .../tests/es2021_logcal_assignments.rs | 17 ++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/crates/swc_ecma_transforms_compat/src/es2021/logical_assignments.rs b/crates/swc_ecma_transforms_compat/src/es2021/logical_assignments.rs index 0f4f19fcfd0a..988e0ad5fb76 100644 --- a/crates/swc_ecma_transforms_compat/src/es2021/logical_assignments.rs +++ b/crates/swc_ecma_transforms_compat/src/es2021/logical_assignments.rs @@ -1,3 +1,5 @@ +use std::mem; + use swc_common::{util::take::Take, DUMMY_SP}; use swc_ecma_ast::*; use swc_ecma_transforms_base::perf::Parallel; @@ -173,17 +175,25 @@ impl VisitMut for Operators { } } + /// [swc_ecma_ast::ModuleItem] is the top level Item in the current + /// implementation of JavaScript until the proposal for + /// [module-declarations] and [module-expressions] are officially added. + /// + /// [module declarations]: https://github.com/tc39/proposal-module-declarations. + /// [module-expressions]: https://github.com/tc39/proposal-module-expressions fn visit_mut_module_items(&mut self, n: &mut Vec) { + let vars = self.vars.take(); n.visit_mut_children_with(self); - if !self.vars.is_empty() { + let vars = mem::replace(&mut self.vars, vars); + if !vars.is_empty() { prepend_stmt( n, VarDecl { span: DUMMY_SP, kind: VarDeclKind::Var, declare: false, - decls: self.vars.take(), + decls: vars, } .into(), ) @@ -191,16 +201,18 @@ impl VisitMut for Operators { } fn visit_mut_stmts(&mut self, n: &mut Vec) { + let vars = self.vars.take(); n.visit_mut_children_with(self); - if !self.vars.is_empty() { + let vars = mem::replace(&mut self.vars, vars); + if !vars.is_empty() { prepend_stmt( n, VarDecl { span: DUMMY_SP, kind: VarDeclKind::Var, declare: false, - decls: self.vars.take(), + decls: vars, } .into(), ) diff --git a/crates/swc_ecma_transforms_compat/tests/es2021_logcal_assignments.rs b/crates/swc_ecma_transforms_compat/tests/es2021_logcal_assignments.rs index f2f573e99b9a..ec9fc1bd8bae 100644 --- a/crates/swc_ecma_transforms_compat/tests/es2021_logcal_assignments.rs +++ b/crates/swc_ecma_transforms_compat/tests/es2021_logcal_assignments.rs @@ -79,6 +79,23 @@ test!( " ); +test!( + syntax(), + |_| tr(), + issue_7169, + "function myFunc(options) { + options.context ||= {} + const closure = function() {} + }", + " + function myFunc(options) { + var _options; + (_options = options).context || (_options.context = {}); + const closure = function() {}; + } + " +); + test_exec!( syntax(), |_| tr(),