Move support for negate_iife in the compressor, rather than code generator

(the code generator doesn't maintain enough context to know whether
the return value is important or discarded)

Fixes #272
This commit is contained in:
Mihai Bazon
2013-08-20 17:45:52 +03:00
parent 4f09df238e
commit ed80b4a534
4 changed files with 126 additions and 16 deletions

View File

@@ -66,6 +66,7 @@ function Compressor(options, false_by_default) {
join_vars : !false_by_default,
cascade : !false_by_default,
side_effects : !false_by_default,
negate_iife : !false_by_default,
screw_ie8 : false,
warnings : true,
@@ -214,6 +215,11 @@ merge(Compressor.prototype, {
statements = join_consecutive_vars(statements, compressor);
}
} while (CHANGED);
if (compressor.option("negate_iife")) {
negate_iifes(statements, compressor);
}
return statements;
function eliminate_spurious_blocks(statements) {
@@ -497,6 +503,40 @@ merge(Compressor.prototype, {
}, []);
};
function negate_iifes(statements, compressor) {
statements.forEach(function(stat){
if (stat instanceof AST_SimpleStatement) {
stat.body = (function transform(thing) {
return thing.transform(new TreeTransformer(function(node){
if (node instanceof AST_Call && node.expression instanceof AST_Function) {
return make_node(AST_UnaryPrefix, node, {
operator: "!",
expression: node
});
}
else if (node instanceof AST_Call) {
node.expression = transform(node.expression);
}
else if (node instanceof AST_Seq) {
node.car = transform(node.car);
}
else if (node instanceof AST_Conditional) {
var expr = transform(node.condition);
if (expr !== node.condition) {
// it has been negated, reverse
node.condition = expr;
var tmp = node.consequent;
node.consequent = node.alternative;
node.alternative = tmp;
}
}
return node;
}));
})(stat.body);
}
});
};
};
function extract_declarations_from_unreachable_code(compressor, stat, target) {