- `booleans` (default: `true`) -- various optimizations for boolean context,
for example `!!a ? b : c → a ? b : c`
-- `cascade` (default: `true`) -- small optimization for sequences, transform
- `x, x` into `x` and `x = something(), x` into `x = something()`
-
- `collapse_vars` (default: `true`) -- Collapse single-use non-constant variables,
side effects permitting.
TreeTransformer.call(this, this.before, this.after);
this.options = defaults(options, {
booleans : !false_by_default,
- cascade : !false_by_default,
collapse_vars : !false_by_default,
comparisons : !false_by_default,
conditionals : !false_by_default,
if (!hit) {
if (node === candidate) {
hit = true;
+ stop_after = find_stop(node, 0);
+ if (stop_after === node) abort = true;
return node;
}
return;
&& (parent instanceof AST_Binary && lazy_op(parent.operator)
|| parent instanceof AST_Conditional
|| parent instanceof AST_If)) {
- if (!(node instanceof AST_Scope)) descend(node, scanner);
- abort = true;
- return node;
+ stop_after = node;
+ if (node instanceof AST_Scope) abort = true;
}
// Skip (non-executed) functions
if (node instanceof AST_Scope) return node;
+ }, function(node) {
+ if (!abort && stop_after === node) abort = true;
});
var multi_replacer = new TreeTransformer(function(node) {
if (abort) return node;
while (candidates.length > 0) {
var candidate = candidates.pop();
var value_def = null;
+ var stop_after = null;
var lhs = get_lhs(candidate);
if (!lhs || is_lhs_read_only(lhs) || lhs.has_side_effects(compressor)) continue;
// Locate symbols which may execute code outside of scanning range
if (expr instanceof AST_Assign && !expr.left.has_side_effects(compressor)
|| expr instanceof AST_Unary && (expr.operator == "++" || expr.operator == "--")) {
candidates.push(expr);
- } else if (expr instanceof AST_Sequence) {
- expr.expressions.forEach(extract_candidates);
+ } else if (expr instanceof AST_Case) {
+ extract_candidates(expr.expression);
+ } else if (expr instanceof AST_Conditional) {
+ extract_candidates(expr.condition);
+ extract_candidates(expr.consequent);
+ extract_candidates(expr.alternative);
} else if (expr instanceof AST_Definitions) {
expr.definitions.forEach(function(var_def) {
if (var_def.value) candidates.push(var_def);
});
+ } else if (expr instanceof AST_Exit) {
+ if (expr.value) extract_candidates(expr.value);
+ } else if (expr instanceof AST_For) {
+ if (expr.init) extract_candidates(expr.init);
+ } else if (expr instanceof AST_If) {
+ extract_candidates(expr.condition);
+ } else if (expr instanceof AST_Sequence) {
+ expr.expressions.forEach(extract_candidates);
} else if (expr instanceof AST_SimpleStatement) {
extract_candidates(expr.body);
- } else if (expr instanceof AST_For && expr.init) {
- extract_candidates(expr.init);
+ } else if (expr instanceof AST_Switch) {
+ extract_candidates(expr.expression);
+ expr.body.forEach(extract_candidates);
}
}
+ function find_stop(node, level) {
+ var parent = scanner.parent(level);
+ if (parent instanceof AST_Case) return node;
+ if (parent instanceof AST_Conditional) return node;
+ if (parent instanceof AST_Exit) return node;
+ if (parent instanceof AST_If) return node;
+ if (parent instanceof AST_Sequence) return find_stop(parent, level + 1);
+ if (parent instanceof AST_Switch) return node;
+ return null;
+ }
+
function mangleable_var(var_def) {
var value = var_def.value;
if (!(value instanceof AST_SymbolRef)) return;
filter_for_side_effects();
var end = expressions.length - 1;
trim_right_for_undefined();
- if (end > 0 && compressor.option("cascade")) trim_left_for_assignment();
if (end == 0) {
self = maintain_this_binding(compressor.parent(), compressor.self(), expressions[0]);
if (!(self instanceof AST_Sequence)) self = self.optimize(compressor);
expressions.length = end + 1;
}
}
-
- function trim_left_for_assignment() {
- for (var i = 0, j = 1; j <= end; j++) {
- var left = expressions[i];
- var cdr = expressions[j];
- if (left instanceof AST_Assign
- && !left.left.has_side_effects(compressor)) {
- left = left.left;
- } else if (left instanceof AST_Unary
- && (left.operator == "++" || left.operator == "--")) {
- left = left.expression;
- } else left = null;
- if (!left || is_lhs_read_only(left) || left.has_side_effects(compressor)) {
- expressions[++i] = cdr;
- continue;
- }
- var parent = null, field;
- expressions[j] = cdr = cdr.clone();
- while (true) {
- if (cdr.equivalent_to(left)) {
- var car = expressions[i];
- if (car instanceof AST_UnaryPostfix) {
- car = make_node(AST_UnaryPrefix, car, {
- operator: car.operator,
- expression: left
- });
- } else {
- car.write_only = false;
- }
- if (parent) {
- parent[field] = car;
- expressions[i] = expressions[j];
- } else {
- expressions[i] = car;
- }
- break;
- }
- if (cdr instanceof AST_Binary && !(cdr instanceof AST_Assign)) {
- if (cdr.left.is_constant()) {
- if (lazy_op(cdr.operator)) {
- expressions[++i] = expressions[j];
- break;
- }
- field = "right";
- } else {
- field = "left";
- }
- } else if (cdr instanceof AST_Call
- && !(left instanceof AST_PropAccess && cdr.expression.equivalent_to(left))
- || cdr instanceof AST_PropAccess
- || cdr instanceof AST_Unary && !unary_side_effects(cdr.operator)) {
- field = "expression";
- } else if (cdr instanceof AST_Conditional) {
- field = "condition";
- } else {
- expressions[++i] = expressions[j];
- break;
- }
- parent = cdr;
- cdr = cdr[field] = cdr[field].clone();
- }
- }
- end = i;
- expressions.length = end + 1;
- }
});
AST_Unary.DEFMETHOD("lift_sequences", function(compressor){
hoist_vars : true,
if_return : true,
join_vars : true,
- cascade : true,
side_effects : true,
negate_iife : true
};
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function fn(x) { return console.log(x), x; }
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true, passes:2
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:false, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:false, loops:false, unused:"keep_assign",
- hoist_funs:true, keep_fargs:true, if_return:true, join_vars:true, cascade:true,
+ hoist_funs:true, keep_fargs:true, if_return:true, join_vars:true,
side_effects:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:false, loops:false, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f1(y) {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
var f1 = function(x, y) {
a = z, b = 7;
return a + b;
};
+ console.log(f1(1, 2));
}
expect: {
var f1 = function(x, y) {
- var a, b, r = x + y;
- return a = r * r - r, b = 7, a + b
+ var r = x + y;
+ return r * r - r + 7;
};
+ console.log(f1(1, 2));
}
+ expect_stdout: "13"
}
collapse_vars_throw: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
var f1 = function(x, y) {
a = z, b = 7;
throw a + b;
};
+ try {
+ f1(1, 2);
+ } catch (e) {
+ console.log(e);
+ }
}
expect: {
var f1 = function(x, y) {
- var a, b, r = x + y;
- throw a = r * r - r, b = 7, a + b
+ var r = x + y;
+ throw r * r - r + 7;
};
+ try {
+ f1(1, 2);
+ } catch (e) {
+ console.log(e);
+ }
}
+ expect_stdout: "13"
}
collapse_vars_switch: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f1() {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function log(x) { return console.log(x), x; }
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:"keep_assign",
- hoist_funs:true, keep_fargs:true, if_return:true, join_vars:true, cascade:true,
+ hoist_funs:true, keep_fargs:true, if_return:true, join_vars:true,
side_effects:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, passes:3
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true, passes:3
}
input: {
function f0(x) { var i = ++x; return x += i; }
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
collapse_vars:true, unused:false,
sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
// avoid bug in self-referential declaration.
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f0(o, p) {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f1(x, y) {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f0(x, y) {
options = {
collapse_vars:true, sequences:false, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
// Don't attempt to collapse vars in presence of eval() or with statement.
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
toplevel:true, reduce_funcs: true, reduce_vars:true
}
input: {
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f0(x) { var a = foo(), b = bar(); return b || x; }
keep_fargs: true,
if_return: false,
join_vars: true,
- cascade: true,
side_effects: true,
}
input: {
collapse_vars_regexp: {
options = {
booleans: true,
- cascade: true,
collapse_vars: true,
comparisons: true,
conditionals: true,
issue_1631_1: {
options = {
- cascade: true,
collapse_vars: true,
hoist_funs: true,
join_vars: true,
issue_1631_2: {
options = {
- cascade: true,
collapse_vars: true,
hoist_funs: true,
join_vars: true,
issue_1631_3: {
options = {
- cascade: true,
collapse_vars: true,
hoist_funs: true,
join_vars: true,
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
var f1 = function(x, y) {
console.log(f(c));
}
}
+
+cascade_conditional: {
+ options = {
+ collapse_vars: true,
+ }
+ input: {
+ function f(a, b) {
+ (a = x(), a) ? a++ : (b = y(a), b(a));
+ }
+ }
+ expect: {
+ function f(a, b) {
+ (a = x()) ? a++ : (b = y(a))(a);
+ }
+ }
+}
+
+cascade_if_1: {
+ options = {
+ collapse_vars: true,
+ }
+ input: {
+ var a;
+ if (a = x(), a)
+ if (a == y()) z();
+ }
+ expect: {
+ var a;
+ if (a = x())
+ if (a == y()) z();
+ }
+}
+
+cascade_if_2: {
+ options = {
+ collapse_vars: true,
+ }
+ input: {
+ function f(a, b) {
+ if (a(), b = x()) return b;
+ }
+ }
+ expect: {
+ function f(a, b) {
+ if (a(), b = x()) return b;
+ }
+ }
+}
+
+cascade_return: {
+ options = {
+ collapse_vars: true,
+ }
+ input: {
+ function f(a) {
+ return a = x();
+ return a;
+ }
+ }
+ expect: {
+ function f(a) {
+ return a = x();
+ return a;
+ }
+ }
+}
+
+cascade_switch: {
+ options = {
+ collapse_vars: true,
+ }
+ input: {
+ function f(a, b) {
+ switch(a = x(), a) {
+ case a = x(), b(a):
+ break;
+ }
+ }
+ }
+ expect: {
+ function f(a, b) {
+ switch(a = x()) {
+ case b(a = x()):
+ break;
+ }
+ }
+ }
+}
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f1() { return a == b ? true : x; }
options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f1() { return a == b ? x : true; }
issue_1539: {
options = {
- cascade: true,
+ collapse_vars: true,
sequences: true,
side_effects: true,
unused: true,
assign_binding: {
options = {
- cascade: true,
+ collapse_vars: true,
side_effects: true,
unused: true,
}
issue_2226_2: {
options = {
- cascade: true,
+ collapse_vars: true,
sequences: true,
side_effects: true,
unused: true,
}
expect: {
console.log(function(a, b) {
- return a += b;
- }(1, 2));
+ return a += 2;
+ }(1));
}
expect_stdout: "3"
}
join_vars : true,
reduce_funcs : true,
reduce_vars : true,
- cascade : true,
+ collapse_vars : true,
inline : true,
}
input: {
join_vars : true,
reduce_funcs : true,
reduce_vars : true,
- cascade : true,
+ collapse_vars : true,
inline : true,
}
input: {
issue_2107: {
options = {
- cascade: true,
collapse_vars: true,
inline: true,
+ passes: 3,
sequences: true,
side_effects: true,
unused: true,
options = {
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
- if_return: true, join_vars: true, cascade: true, side_effects: true
+ if_return: true, join_vars: true, side_effects: true
}
input: {
function foo(x) {
options = {
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
- if_return: true, join_vars: true, cascade: true, side_effects: true,
+ if_return: true, join_vars: true, side_effects: true,
collapse_vars: false, passes: 2, warnings: "verbose"
}
input: {
options = {
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
- if_return: true, join_vars: true, cascade: true, side_effects: true,
+ if_return: true, join_vars: true, side_effects: true,
collapse_vars: false
}
input: {
options = {
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
- if_return: true, join_vars: true, cascade: true, side_effects: true
+ if_return: true, join_vars: true, side_effects: true
}
input: {
"use strict";
options = {
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
- if_return: true, join_vars: true, cascade: true, side_effects: true,
+ if_return: true, join_vars: true, side_effects: true,
collapse_vars: false, passes: 2, warnings: "verbose"
}
input: {
options = {
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
- if_return: true, join_vars: true, cascade: true, side_effects: true,
+ if_return: true, join_vars: true, side_effects: true,
collapse_vars: false
}
input: {
keep_fargs: true,
if_return: true,
join_vars: true,
- cascade: true,
side_effects: true,
sequences: false,
keep_infinity: false,
keep_fargs: true,
if_return: true,
join_vars: true,
- cascade: true,
side_effects: true,
sequences: false,
keep_infinity: true,
unused : true,
if_return : true,
join_vars : true,
- cascade : true,
negate_iife : true,
}
input: {
a.b(), f.g();
}
expect_warnings: [
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:17,8]",
- "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:17,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:30,37]",
- "WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:30,16]",
- "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:28,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:39,31]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,8]",
+ "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:16,8]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:29,37]",
+ "WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:29,16]",
+ "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:27,8]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:37,8]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,31]",
]
}
unused : true,
if_return : true,
join_vars : true,
- cascade : true,
negate_iife : true,
toplevel : true,
}
a.b(), f.g();
}
expect_warnings: [
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:79,8]",
- "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:79,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:92,37]",
- "WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:92,16]",
- "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:90,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:107,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:108,31]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:84,33]",
- "WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:84,12]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:100,45]",
- "WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:100,12]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:77,8]",
+ "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:77,8]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:90,37]",
+ "WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:90,16]",
+ "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:88,8]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:105,8]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:106,31]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:82,33]",
+ "WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:82,12]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:98,45]",
+ "WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:98,12]",
]
}
baz();
}
expect_warnings: [
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:137,61]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:137,23]",
- "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:137,23]",
- "WARN: Boolean || always true [test/compress/issue-1261.js:138,23]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,61]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
+ "WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:135,23]",
+ "WARN: Boolean || always true [test/compress/issue-1261.js:136,23]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,23]",
+ "WARN: Condition always true [test/compress/issue-1261.js:136,23]",
+ "WARN: Condition left of || always true [test/compress/issue-1261.js:137,8]",
+ "WARN: Condition always true [test/compress/issue-1261.js:137,8]",
+ "WARN: Boolean && always false [test/compress/issue-1261.js:138,23]",
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:138,23]",
- "WARN: Condition always true [test/compress/issue-1261.js:138,23]",
- "WARN: Condition left of || always true [test/compress/issue-1261.js:139,8]",
- "WARN: Condition always true [test/compress/issue-1261.js:139,8]",
- "WARN: Boolean && always false [test/compress/issue-1261.js:140,23]",
+ "WARN: Condition always false [test/compress/issue-1261.js:138,23]",
+ "WARN: Condition left of && always false [test/compress/issue-1261.js:139,8]",
+ "WARN: Condition always false [test/compress/issue-1261.js:139,8]",
+ "WARN: + in boolean context always true [test/compress/issue-1261.js:140,23]",
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:140,23]",
- "WARN: Condition always false [test/compress/issue-1261.js:140,23]",
- "WARN: Condition left of && always false [test/compress/issue-1261.js:141,8]",
- "WARN: Condition always false [test/compress/issue-1261.js:141,8]",
- "WARN: + in boolean context always true [test/compress/issue-1261.js:142,23]",
+ "WARN: Condition always true [test/compress/issue-1261.js:140,23]",
+ "WARN: + in boolean context always true [test/compress/issue-1261.js:141,8]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:141,31]",
+ "WARN: Condition always true [test/compress/issue-1261.js:141,8]",
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:142,23]",
- "WARN: Condition always true [test/compress/issue-1261.js:142,23]",
- "WARN: + in boolean context always true [test/compress/issue-1261.js:143,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:143,31]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:143,24]",
"WARN: Condition always true [test/compress/issue-1261.js:143,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:144,23]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:145,24]",
- "WARN: Condition always true [test/compress/issue-1261.js:145,8]",
- "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:146,31]",
- "WARN: Condition always false [test/compress/issue-1261.js:146,8]",
+ "WARN: Dropping __PURE__ call [test/compress/issue-1261.js:144,31]",
+ "WARN: Condition always false [test/compress/issue-1261.js:144,8]",
]
}
unused : true,
if_return : true,
join_vars : true,
- cascade : true,
hoist_funs : true,
};
input: {
hoist_vars : true,
join_vars : true,
if_return : true,
- cascade : true,
conditionals : false,
}
input: {
issue_1639_1: {
options = {
booleans: true,
- cascade: true,
+ collapse_vars: true,
conditionals: true,
evaluate: true,
join_vars: true,
issue_1639_2: {
options = {
booleans: true,
- cascade: true,
+ collapse_vars: true,
conditionals: true,
evaluate: true,
join_vars: true,
issue_1639_3: {
options = {
booleans: true,
- cascade: true,
+ collapse_vars: true,
conditionals: true,
evaluate: true,
sequences: true,
f7: {
options = {
booleans: true,
- cascade: true,
collapse_vars: true,
comparisons: true,
conditionals: true,
drop_fargs: {
options = {
- cascade: true,
+ collapse_vars: true,
inline: true,
keep_fargs: false,
side_effects: true,
keep_fargs: {
options = {
- cascade: true,
+ collapse_vars: true,
inline: true,
keep_fargs: true,
side_effects: true,
collapse: {
options = {
- cascade: true,
+ collapse_vars: true,
sequences: true,
side_effects: true,
unused: true,
return void 0 !== ('function' === typeof b ? b() : b) && c();
}
function f2(b) {
- return b = c(), 'stirng' == typeof ('function' === typeof b ? b() : b) && d();
+ return 'stirng' == typeof ('function' === typeof (b = c()) ? b() : b) && d();
}
function f3(c) {
var a;
hoist_vars : true,
if_return : true,
join_vars : true,
- cascade : true,
side_effects : true,
negate_iife : false
};
options = {
collapse_vars:true, sequences:false, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
};
input: {
function f1() {
options = {
sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f1() {
options = {
sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
- keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true
+ keep_fargs:true, if_return:true, join_vars:true, side_effects:true
}
input: {
function f3() {
issue_2110_1: {
options = {
- cascade: true,
+ collapse_vars: true,
pure_getters: "strict",
sequences: true,
side_effects: true,
set_immutable_2: {
options = {
- cascade: true,
+ collapse_vars: true,
conditionals: true,
pure_getters: "strict",
reduce_funcs: true,
set_immutable_4: {
options = {
- cascade: true,
+ collapse_vars: true,
conditionals: true,
pure_getters: "strict",
reduce_funcs: true,
set_mutable_2: {
options = {
- cascade: true,
+ collapse_vars: true,
conditionals: true,
pure_getters: "strict",
reduce_funcs: true,
issue_2313_1: {
options = {
- cascade: true,
+ collapse_vars: true,
conditionals: true,
pure_getters: "strict",
sequences: true,
issue_2313_2: {
options = {
- cascade: true,
+ collapse_vars: true,
conditionals: true,
pure_getters: true,
sequences: true,
redefine_farg_3: {
options = {
- cascade: true,
+ collapse_vars: true,
evaluate: true,
inline: true,
keep_fargs: false,
keep_fnames : false,
hoist_vars : true,
join_vars : true,
- cascade : true,
negate_iife : true
};
input: {
issue_1685: {
options = {
- cascade: true,
+ collapse_vars: true,
side_effects: true,
}
input: {
func_def_1: {
options = {
- cascade: true,
+ collapse_vars: true,
side_effects: true,
}
input: {
func_def_2: {
options = {
- cascade: true,
+ collapse_vars: true,
side_effects: true,
}
input: {
func_def_3: {
options = {
- cascade: true,
+ collapse_vars: true,
side_effects: true,
}
input: {
func_def_4: {
options = {
- cascade: true,
+ collapse_vars: true,
side_effects: true,
}
input: {
func_def_5: {
options = {
- cascade: true,
+ collapse_vars: true,
side_effects: true,
}
input: {
side_effects_cascade_1: {
options = {
- cascade: true,
+ collapse_vars: true,
conditionals: true,
sequences: true,
side_effects: true,
side_effects_cascade_2: {
options = {
- cascade: true,
+ collapse_vars: true,
side_effects: true,
}
input: {
side_effects_cascade_3: {
options = {
- cascade: true,
+ collapse_vars: true,
conditionals: true,
side_effects: true,
}
expect: {
function f(a, b) {
!(b += a) && ((b = a) || (b -= a, b ^= a)),
- --a;
+ a--;
}
}
}
issue_27: {
options = {
- cascade: true,
+ collapse_vars: true,
passes: 2,
sequences: true,
side_effects: true,
issue_2062: {
options = {
booleans: true,
- cascade: true,
+ collapse_vars: true,
conditionals: true,
side_effects: true,
}
issue_2313: {
options = {
- cascade: true,
+ collapse_vars: true,
sequences: true,
side_effects: true,
}
}
expect_stdout: "2 1"
}
+
+cascade_assignment_in_return: {
+ options = {
+ collapse_vars: true,
+ unused: true,
+ }
+ input: {
+ function f(a, b) {
+ return a = x(), b(a);
+ }
+ }
+ expect: {
+ function f(a, b) {
+ return b(x());
+ }
+ }
+}