Fix compression with unused containing destructuring
This commit is contained in:
committed by
Richard van Velzen
parent
abbeb266b5
commit
52ce9a333c
@@ -1384,6 +1384,8 @@ merge(Compressor.prototype, {
|
|||||||
var in_use = [];
|
var in_use = [];
|
||||||
var in_use_ids = {}; // avoid expensive linear scans of in_use
|
var in_use_ids = {}; // avoid expensive linear scans of in_use
|
||||||
var initializations = new Dictionary();
|
var initializations = new Dictionary();
|
||||||
|
var destructuring_value = null;
|
||||||
|
var in_definition = false;
|
||||||
// pass 1: find out which symbols are directly used in
|
// pass 1: find out which symbols are directly used in
|
||||||
// this scope (not in nested scopes).
|
// this scope (not in nested scopes).
|
||||||
var scope = this;
|
var scope = this;
|
||||||
@@ -1395,9 +1397,17 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
if (node instanceof AST_Definitions && scope === self) {
|
if (node instanceof AST_Definitions && scope === self) {
|
||||||
node.definitions.forEach(function(def){
|
node.definitions.forEach(function(def){
|
||||||
if (def.is_destructuring()) return; /* Destructurings are type assertions! */
|
|
||||||
if (def.value) {
|
if (def.value) {
|
||||||
|
if (def.is_destructuring()) {
|
||||||
|
var destructuring_cache = destructuring_value;
|
||||||
|
destructuring_value = def.value;
|
||||||
|
in_definition = true;
|
||||||
|
def.walk(tw);
|
||||||
|
in_definition = false;
|
||||||
|
destructuring_value = destructuring_cache;
|
||||||
|
} else {
|
||||||
initializations.add(def.name.name, def.value);
|
initializations.add(def.name.name, def.value);
|
||||||
|
}
|
||||||
if (def.value.has_side_effects(compressor)) {
|
if (def.value.has_side_effects(compressor)) {
|
||||||
def.value.walk(tw);
|
def.value.walk(tw);
|
||||||
}
|
}
|
||||||
@@ -1420,6 +1430,39 @@ merge(Compressor.prototype, {
|
|||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_Destructuring) {
|
||||||
|
if (!in_definition) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < node.names.length; i++) {
|
||||||
|
if (node.names[i] instanceof AST_Destructuring) {
|
||||||
|
node.names[i].walk(tw);
|
||||||
|
}
|
||||||
|
else if (node.names[i] instanceof AST_Expansion) {
|
||||||
|
if (node.names[i].expression instanceof AST_Symbol) {
|
||||||
|
initializations.add(node.names[i].expression.name, destructuring_value);
|
||||||
|
} else {
|
||||||
|
throw new Error(string_template("Can't handle expansion of type: {type}", {
|
||||||
|
type: Object.getPrototypeOf(node.names[i].expression).TYPE
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (node.names[i] instanceof AST_Hole) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (node.names[i] instanceof AST_ObjectKeyVal && typeof node.names[i].key === "string") {
|
||||||
|
initializations.add(node.names[i].key, destructuring_value);
|
||||||
|
}
|
||||||
|
else if (node.names[i] instanceof AST_Symbol) {
|
||||||
|
initializations.add(node.names[i].name, destructuring_value);
|
||||||
|
} else {
|
||||||
|
throw new Error(string_template("Unknown destructuring element of type: {type}", {
|
||||||
|
type: Object.getPrototypeOf(node.names[i]).TYPE
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|||||||
@@ -104,3 +104,99 @@ destructuring_expressions: {
|
|||||||
expect_exact: "({a,b});[{a}];f({x});"
|
expect_exact: "({a,b});[{a}];f({x});"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
destructuring_remove_unused_1: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [1];
|
||||||
|
var [b] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = {b: 1};
|
||||||
|
var {b} = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function c() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [[1]];
|
||||||
|
var [[b]] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function d() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = {b: {b:1}};
|
||||||
|
var {b:{b}} = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function e() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [1, 2, 3, 4, 5];
|
||||||
|
var [b, ...c] = a;
|
||||||
|
f(b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
var a = [1];
|
||||||
|
var [b] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
var a = {b: 1};
|
||||||
|
var {b} = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function c() {
|
||||||
|
var a = [[1]];
|
||||||
|
var [[b]] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function d() {
|
||||||
|
var a = {b: {b:1}};
|
||||||
|
var {b:{b}} = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function e() {
|
||||||
|
var a = [1, 2, 3, 4, 5];
|
||||||
|
var [b, ...c] = a;
|
||||||
|
f(b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_remove_unused_2: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [,,1];
|
||||||
|
var [b] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [{a: [1]}];
|
||||||
|
var [{b: a}] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
var a = [,,1];
|
||||||
|
var [b] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
var a = [{a: [1]}];
|
||||||
|
var [{b: a}] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user