diff --git a/lib/compress.js b/lib/compress.js index ac66ce6ac1..7264153de7 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -6801,21 +6801,25 @@ merge(Compressor.prototype, { var dirs = []; var hoisted = []; var vars = new Dictionary(), vars_found = 0; - var tt = new TreeTransformer(function(node) { + var tt = new TreeTransformer(function(node, descend, in_list) { if (node === self) return; if (node instanceof AST_Directive) { dirs.push(node); - return make_node(AST_EmptyStatement, node); + return in_list ? List.skip : make_node(AST_EmptyStatement, node); } - if (node instanceof AST_Defun) { + if (node instanceof AST_LambdaDefinition) { if (!hoist_funs) return node; - if (tt.parent() !== self && compressor.has_directive("use strict")) return node; + var p = tt.parent(); + if (p instanceof AST_ExportDeclaration) return node; + if (p instanceof AST_ExportDefault) return node; + if (p !== self && compressor.has_directive("use strict")) return node; hoisted.push(node); - return make_node(AST_EmptyStatement, node); + return in_list ? List.skip : make_node(AST_EmptyStatement, node); } if (node instanceof AST_Var) { if (!hoist_vars) return node; - if (tt.parent() instanceof AST_ExportDeclaration) return node; + var p = tt.parent(); + if (p instanceof AST_ExportDeclaration) return node; if (!all(node.definitions, function(defn) { var sym = defn.name; return sym instanceof AST_SymbolVar @@ -6827,17 +6831,14 @@ merge(Compressor.prototype, { ++vars_found; }); var seq = node.to_assignments(); - var p = tt.parent(); if (p instanceof AST_ForEnumeration && p.init === node) { if (seq) return seq; var def = node.definitions[0].name; return make_node(AST_SymbolRef, def, def); } if (p instanceof AST_For && p.init === node) return seq; - if (!seq) return make_node(AST_EmptyStatement, node); - return make_node(AST_SimpleStatement, node, { - body: seq - }); + if (!seq) return in_list ? List.skip : make_node(AST_EmptyStatement, node); + return make_node(AST_SimpleStatement, node, { body: seq }); } if (node instanceof AST_Scope) return node; if (node instanceof AST_SymbolConst) { diff --git a/test/compress/exports.js b/test/compress/exports.js index bef2d85c95..bc43628324 100644 --- a/test/compress/exports.js +++ b/test/compress/exports.js @@ -399,6 +399,17 @@ single_use_class_default: { } } +hoist_funs: { + options = { + hoist_funs: true, + } + input: { + export function f() {} + export default async function* g() {} + } + expect_exact: "export function f(){}export default async function*g(){}" +} + issue_4742_join_vars_1: { options = { join_vars: true,