fix corner case in `hoist_funs` (#4790)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 16 Mar 2021 17:48:23 +0000 (17:48 +0000)
committerGitHub <noreply@github.com>
Tue, 16 Mar 2021 17:48:23 +0000 (01:48 +0800)
lib/compress.js
test/compress/exports.js

index ac66ce6..7264153 100644 (file)
@@ -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) {
index bef2d85..bc43628 100644 (file)
@@ -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,