diff --git a/crates/oxc_minifier/src/peephole/collapse_variable_declarations.rs b/crates/oxc_minifier/src/peephole/collapse_variable_declarations.rs index ae276f7bd63d8..933d9b78fee58 100644 --- a/crates/oxc_minifier/src/peephole/collapse_variable_declarations.rs +++ b/crates/oxc_minifier/src/peephole/collapse_variable_declarations.rs @@ -225,7 +225,6 @@ mod test { } #[test] - #[ignore] fn test_for_of() { test("var a; for (a of b) foo()", "for (var a of b) foo()"); test_same("a = 0; for (a of b) foo()"); diff --git a/crates/oxc_minifier/src/peephole/minimize_statements.rs b/crates/oxc_minifier/src/peephole/minimize_statements.rs index 7e853769f47cf..e5e776bdcdf5d 100644 --- a/crates/oxc_minifier/src/peephole/minimize_statements.rs +++ b/crates/oxc_minifier/src/peephole/minimize_statements.rs @@ -407,6 +407,38 @@ impl<'a> PeepholeOptimizations { } result.push(Statement::ForInStatement(for_in_stmt)); } + Statement::ForOfStatement(mut for_of_stmt) => { + // "var a; for (a of b) c" => "for (var a of b) c" + if let Some(Statement::VariableDeclaration(prev_var_decl)) = result.last_mut() { + if let ForStatementLeft::AssignmentTargetIdentifier(id) = &for_of_stmt.left { + let prev_var_decl_no_init_item = { + if prev_var_decl.kind.is_var() + && prev_var_decl.declarations.len() == 1 + && prev_var_decl.declarations[0].init.is_none() + { + Some(&prev_var_decl.declarations[0]) + } else { + None + } + }; + if let Some(prev_var_decl_item) = prev_var_decl_no_init_item { + if let BindingPatternKind::BindingIdentifier(decl_id) = + &prev_var_decl_item.id.kind + { + if id.name == decl_id.name { + for_of_stmt.left = + ForStatementLeft::VariableDeclaration(ctx.ast.alloc( + ctx.ast.move_variable_declaration(prev_var_decl), + )); + result.pop(); + self.mark_current_function_as_changed(); + } + } + } + } + } + result.push(Statement::ForOfStatement(for_of_stmt)); + } stmt => result.push(stmt), } }