enhance join_vars (#4643)

This commit is contained in:
Alex Lam S.L
2021-02-10 20:59:25 +00:00
committed by GitHub
parent 083679bcad
commit 952765be66
2 changed files with 110 additions and 7 deletions

View File

@@ -3049,13 +3049,13 @@ merge(Compressor.prototype, {
statements.length = n;
}
function extract_exprs(body) {
if (body instanceof AST_Assign) return [ body ];
if (body instanceof AST_Sequence) return body.expressions.slice();
}
function join_assigns(defn, body, keep) {
var exprs;
if (body instanceof AST_Assign) {
exprs = [ body ];
} else if (body instanceof AST_Sequence) {
exprs = body.expressions.slice();
}
var exprs = extract_exprs(body);
if (!exprs) return;
var trimmed = false;
for (var i = exprs.length - 1; --i >= 0;) {
@@ -3082,6 +3082,17 @@ merge(Compressor.prototype, {
return trimmed && exprs;
}
function merge_assigns(prev, defn) {
if (!(prev instanceof AST_SimpleStatement)) return;
if (declarations_only(defn)) return;
var exprs = extract_exprs(prev.body);
if (!exprs) return;
var definitions = [];
if (!join_var_assign(definitions, exprs.reverse(), 0)) return;
defn.definitions = definitions.reverse().concat(defn.definitions);
return exprs.reverse();
}
function merge_conditional_assignments(var_def, exprs, keep) {
if (!compressor.option("conditionals")) return;
if (var_def.name instanceof AST_Destructured) return;
@@ -3173,9 +3184,20 @@ merge(Compressor.prototype, {
} else if (defs && defs.TYPE == stat.TYPE && declarations_only(stat)) {
defs.definitions = defs.definitions.concat(stat.definitions);
CHANGED = true;
} else if (stat instanceof AST_Var) {
var exprs = merge_assigns(prev, stat);
if (exprs) {
if (exprs.length) {
prev.body = make_sequence(prev, exprs);
j++;
}
CHANGED = true;
} else {
j++;
}
statements[j] = defs = stat;
} else {
statements[++j] = stat;
if (stat instanceof AST_Var) defs = stat;
}
continue;
} else if (stat instanceof AST_Exit) {
@@ -3199,6 +3221,15 @@ merge(Compressor.prototype, {
CHANGED = true;
} else if (stat.init instanceof AST_Var) {
defs = stat.init;
exprs = merge_assigns(prev, stat.init);
if (exprs) {
CHANGED = true;
if (exprs.length == 0) {
statements[j] = merge_defns(stat);
continue;
}
prev.body = make_sequence(prev, exprs);
}
}
} else if (stat instanceof AST_ForEnumeration) {
if (defs && defs.TYPE == stat.init.TYPE) {