Skip to content

Commit a7e7865

Browse files
authored
fix corner case in unused (#5086)
fixes #5085
1 parent ef5f7fc commit a7e7865

File tree

2 files changed

+66
-15
lines changed

2 files changed

+66
-15
lines changed

lib/compress.js

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6513,8 +6513,10 @@ merge(Compressor.prototype, {
65136513
return null;
65146514
}, true);
65156515
if (trimmed.name) {
6516-
def.name = trimmed.name;
6517-
def.value = value = trimmed.value;
6516+
def = make_node(AST_VarDef, def, {
6517+
name: trimmed.name,
6518+
value: value = trimmed.value,
6519+
});
65186520
flush();
65196521
} else if (trimmed.value) {
65206522
side_effects.push(trimmed.value);
@@ -6722,19 +6724,18 @@ merge(Compressor.prototype, {
67226724
}
67236725
if (node instanceof AST_Assign) {
67246726
descend(node, tt);
6725-
if (node.left instanceof AST_Destructured) {
6726-
var trimmed = trim_destructured(node.left, node.right, function(node) {
6727-
return node;
6728-
}, node.write_only === true);
6729-
if (!trimmed.name) {
6730-
if (trimmed.value) return trimmed.value;
6731-
if (parent instanceof AST_Sequence && parent.tail_node() !== node) return List.skip;
6732-
return make_node(AST_Number, node, { value: 0 });
6733-
}
6734-
node.left = trimmed.name;
6735-
node.right = trimmed.value;
6736-
}
6737-
return node;
6727+
if (!(node.left instanceof AST_Destructured)) return node;
6728+
var trimmed = trim_destructured(node.left, node.right, function(node) {
6729+
return node;
6730+
}, node.write_only === true);
6731+
if (trimmed.name) return make_node(AST_Assign, node, {
6732+
operator: node.operator,
6733+
left: trimmed.name,
6734+
right: trimmed.value,
6735+
});
6736+
if (trimmed.value) return trimmed.value;
6737+
if (parent instanceof AST_Sequence && parent.tail_node() !== node) return List.skip;
6738+
return make_node(AST_Number, node, { value: 0 });
67386739
}
67396740
if (node instanceof AST_LabeledStatement && node.body instanceof AST_For) {
67406741
// Certain combination of unused name + side effect leads to invalid AST:

test/compress/destructured.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2948,3 +2948,53 @@ issue_5074_method_pure_getters: {
29482948
expect_stdout: "PASS"
29492949
node_version: ">=6"
29502950
}
2951+
2952+
issue_5085_1: {
2953+
options = {
2954+
evaluate: true,
2955+
reduce_vars: true,
2956+
toplevel: true,
2957+
unsafe: true,
2958+
unused: true,
2959+
}
2960+
input: {
2961+
var a = "PASS";
2962+
var [ b ] = [ 42, a ], c = b ? 0 : a = "FAIL";
2963+
console.log(a);
2964+
}
2965+
expect: {
2966+
var a = "PASS";
2967+
var b = [ 42 ][0];
2968+
b;
2969+
console.log(a);
2970+
}
2971+
expect_stdout: "PASS"
2972+
node_version: ">=6"
2973+
}
2974+
2975+
issue_5085_2: {
2976+
options = {
2977+
evaluate: true,
2978+
reduce_vars: true,
2979+
side_effects: true,
2980+
unsafe: true,
2981+
unused: true,
2982+
}
2983+
input: {
2984+
var a = "PASS";
2985+
(function(b) {
2986+
[ b ] = [ 42, a ];
2987+
var c = b ? 0 : a = "FAIL";
2988+
})();
2989+
console.log(a);
2990+
}
2991+
expect: {
2992+
var a = "PASS";
2993+
(function(b) {
2994+
b = [ 42 ][0];
2995+
})();
2996+
console.log(a);
2997+
}
2998+
expect_stdout: "PASS"
2999+
node_version: ">=6"
3000+
}

0 commit comments

Comments
 (0)