aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-03-16 17:48:23 +0000
committerGitHub <noreply@github.com>2021-03-17 01:48:23 +0800
commitb872ffee019b73c433f9647e2b3c8169b5dd120a (patch)
tree34876b6155474bc5ea8e4676d21de37e631184ac
parent9a9543013c9d56cfc9593893fb9bfdff2aaa0307 (diff)
downloadtracifyjs-b872ffee019b73c433f9647e2b3c8169b5dd120a.tar.gz
tracifyjs-b872ffee019b73c433f9647e2b3c8169b5dd120a.zip
fix corner case in `hoist_funs` (#4790)
-rw-r--r--lib/compress.js23
-rw-r--r--test/compress/exports.js11
2 files changed, 23 insertions, 11 deletions
diff --git a/lib/compress.js b/lib/compress.js
index ac66ce6a..7264153d 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 bef2d85c..bc436283 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,