fix corner case in directives & expression (#5369)

fixes #5368
This commit is contained in:
Alex Lam S.L
2022-02-23 21:04:04 +00:00
committed by GitHub
parent 313e4974a4
commit a9d0ddea9d
2 changed files with 45 additions and 15 deletions

View File

@@ -227,9 +227,7 @@ Compressor.prototype.exposed = function(def) {
Compressor.prototype.compress = function(node) { Compressor.prototype.compress = function(node) {
node = node.resolve_defines(this); node = node.resolve_defines(this);
node.hoist_exports(this); node.hoist_exports(this);
if (this.option("expression")) { if (this.option("expression")) node.process_expression(true);
node.process_expression(true);
}
var merge_vars = this.options.merge_vars; var merge_vars = this.options.merge_vars;
var passes = +this.options.passes || 1; var passes = +this.options.passes || 1;
var min_count = 1 / 0; var min_count = 1 / 0;
@@ -261,9 +259,7 @@ Compressor.prototype.compress = function(node) {
} }
} }
} }
if (this.option("expression")) { if (this.option("expression")) node.process_expression(false);
node.process_expression(false);
}
return node; return node;
}; };
@@ -308,12 +304,19 @@ Compressor.prototype.compress = function(node) {
AST_Scope.DEFMETHOD("process_expression", function(insert, transform) { AST_Scope.DEFMETHOD("process_expression", function(insert, transform) {
var self = this; var self = this;
var tt = new TreeTransformer(function(node) { var tt = new TreeTransformer(function(node) {
if (insert && node instanceof AST_SimpleStatement) { if (insert) {
if (node instanceof AST_Directive) node = make_node(AST_SimpleStatement, node, {
body: make_node(AST_String, node, node),
});
if (node instanceof AST_SimpleStatement) {
return transform ? transform(node) : make_node(AST_Return, node, { value: node.body }); return transform ? transform(node) : make_node(AST_Return, node, { value: node.body });
} }
if (!insert && node instanceof AST_Return) { } else if (node instanceof AST_Return) {
return transform ? transform(node) : make_node(AST_SimpleStatement, node, { if (transform) return transform(node);
body: node.value || make_node(AST_UnaryPrefix, node, { var value = node.value;
if (value instanceof AST_String) return make_node(AST_Directive, node, value);
return make_node(AST_SimpleStatement, node, {
body: value || make_node(AST_UnaryPrefix, node, {
operator: "void", operator: "void",
expression: make_node(AST_Number, node, { value: 0 }), expression: make_node(AST_Number, node, { value: 0 }),
}), }),
@@ -334,9 +337,7 @@ Compressor.prototype.compress = function(node) {
} }
} else if (node instanceof AST_If) { } else if (node instanceof AST_If) {
node.body = node.body.transform(tt); node.body = node.body.transform(tt);
if (node.alternative) { if (node.alternative) node.alternative = node.alternative.transform(tt);
node.alternative = node.alternative.transform(tt);
}
} else if (node instanceof AST_With) { } else if (node instanceof AST_With) {
node.body = node.body.transform(tt); node.body = node.body.transform(tt);
} }

View File

@@ -129,3 +129,32 @@ valid_after_invalid_2: {
} }
expect_stdout: "undefined" expect_stdout: "undefined"
} }
issue_5368_1: {
options = {
directives: true,
expression: true,
}
input: {
"foo";
}
expect: {
"foo";
}
}
issue_5368_2: {
options = {
directives: true,
expression: true,
}
input: {
"foo";
(function() {
"bar";
})();
}
expect: {
(function() {})();
}
}