Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(es/minifier): Preserve delete of unresolved variables #7072

Merged
merged 10 commits into from
Mar 15, 2023
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ var obj = {
baz: "qux",
quux: "quuz"
};
obj.foo, delete _object_without_properties(obj, [
obj.foo;
var rest = _object_without_properties(obj, [
"foo"
]).baz;
]);
delete rest.baz;
19 changes: 12 additions & 7 deletions crates/swc_ecma_minifier/src/compress/optimize/sequences.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1487,13 +1487,18 @@ where
)
};

if b.is_lit()
|| b.is_class()
|| b.is_fn_expr()
|| b.is_arrow()
|| b.is_await_expr()
|| b.is_yield_expr()
{
if match &*b {
Expr::Arrow(..)
| Expr::Fn(..)
| Expr::Class(..)
| Expr::Lit(..)
| Expr::Await(..)
| Expr::Yield(..) => true,
Expr::Unary(UnaryExpr {
op: op!("delete"), ..
}) => true,
_ => false,
} {
return Ok(false);
}

Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_minifier/src/compress/pure/bools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ impl Pure<'_> {

e if is_pure_undefined(&self.expr_ctx, e) => true,

Expr::Ident(..) => true,
Expr::Ident(i) => i.span.ctxt != self.expr_ctx.unresolved_ctxt,

// NaN
Expr::Bin(BinExpr {
Expand Down
3 changes: 2 additions & 1 deletion crates/swc_ecma_minifier/tests/benches-full/echarts.js
Original file line number Diff line number Diff line change
Expand Up @@ -3911,7 +3911,8 @@
for(var roots = this.storage.getRoots(), i = 0; i < roots.length; i++)roots[i] instanceof Group && roots[i].removeSelfFromZr(this);
this.storage.delAllRoots(), this.painter.clear();
}, ZRender.prototype.dispose = function() {
this.animation.stop(), this.clear(), this.storage.dispose(), this.painter.dispose(), this.handler.dispose(), this.animation = this.storage = this.painter = this.handler = null, delete instances[this.id];
var id;
this.animation.stop(), this.clear(), this.storage.dispose(), this.painter.dispose(), this.handler.dispose(), this.animation = this.storage = this.painter = this.handler = null, id = this.id, delete instances[id];
}, ZRender;
}();
function init(dom, opts) {
Expand Down
4 changes: 3 additions & 1 deletion crates/swc_ecma_minifier/tests/benches-full/three.js
Original file line number Diff line number Diff line change
Expand Up @@ -13072,7 +13072,9 @@
var actions = this._actions, lastInactiveAction = actions[actions.length - 1], cacheIndex = action._cacheIndex;
lastInactiveAction._cacheIndex = cacheIndex, actions[cacheIndex] = lastInactiveAction, actions.pop(), action._cacheIndex = null;
var clipUuid = action._clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[clipUuid], knownActionsForClip = actionsForClip.knownActions, lastKnownAction = knownActionsForClip[knownActionsForClip.length - 1], byClipCacheIndex = action._byClipCacheIndex;
lastKnownAction._byClipCacheIndex = byClipCacheIndex, knownActionsForClip[byClipCacheIndex] = lastKnownAction, knownActionsForClip.pop(), action._byClipCacheIndex = null, delete actionsForClip.actionByRoot[(action._localRoot || this._root).uuid], 0 === knownActionsForClip.length && delete actionsByClip[clipUuid], this._removeInactiveBindingsForAction(action);
lastKnownAction._byClipCacheIndex = byClipCacheIndex, knownActionsForClip[byClipCacheIndex] = lastKnownAction, knownActionsForClip.pop(), action._byClipCacheIndex = null;
var actionByRoot = actionsForClip.actionByRoot, rootUuid = (action._localRoot || this._root).uuid;
delete actionByRoot[rootUuid], 0 === knownActionsForClip.length && delete actionsByClip[clipUuid], this._removeInactiveBindingsForAction(action);
},
_removeInactiveBindingsForAction: function(action) {
for(var bindings = action._propertyBindings, i = 0, n = bindings.length; i !== n; ++i){
Expand Down
3 changes: 3 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7045/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
a = 1;
delete a;
console.log(typeof a);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a = 1, delete a, console.log(typeof a);
Original file line number Diff line number Diff line change
Expand Up @@ -5734,7 +5734,10 @@
}
}, this.removeMarker = function(markerId) {
var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];
marker && (delete (marker.inFront ? this.$frontMarkers : this.$backMarkers)[markerId], this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker"));
if (marker) {
var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;
delete markers[markerId], this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker");
}
}, this.getMarkers = function(inFront) {
return inFront ? this.$frontMarkers : this.$backMarkers;
}, this.highlight = function(re) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7859,7 +7859,10 @@
if (this.directivekeys) {
var changedProps = [], directiveValue = this.validateChildren({}, this.directivekeys, props || this.props);
if (directiveValue && Object.keys(directiveValue).length) {
if (!silent && this.skipRefresh) for(var _a = 0, _b = this.skipRefresh; _a < _b.length; _a++)delete directiveValue[_b[_a]];
if (!silent && this.skipRefresh) for(var _a = 0, _b = this.skipRefresh; _a < _b.length; _a++){
var fields = _b[_a];
delete directiveValue[fields];
}
if (this.prevProperties) for(var dKeys = Object.keys(this.prevProperties), i = 0; i < dKeys.length; i++){
var key = dKeys[i];
if (directiveValue.hasOwnProperty(key)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
};
if (dynamicOptions instanceof Promise ? loadableOptions1.loader = function() {
return dynamicOptions;
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && delete (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated)).loadableGenerated, "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, delete (loadableOptions = loadableOptions1).webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated), delete loadableOptions1.loadableGenerated), "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, loadableOptions = loadableOptions1, delete loadableOptions.webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
delete loadableOptions1.ssr;
}
return loadableFn(loadableOptions1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
};
if (dynamicOptions instanceof Promise ? loadableOptions1.loader = function() {
return dynamicOptions;
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && delete (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated)).loadableGenerated, "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, delete (loadableOptions = loadableOptions1).webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated), delete loadableOptions1.loadableGenerated), "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, loadableOptions = loadableOptions1, delete loadableOptions.webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
delete loadableOptions1.ssr;
}
return loadableFn(loadableOptions1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@
};
if (dynamicOptions instanceof Promise ? loadableOptions1.loader = function() {
return dynamicOptions;
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && delete (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated)).loadableGenerated, "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, delete (loadableOptions = loadableOptions1).webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated), delete loadableOptions1.loadableGenerated), "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, loadableOptions = loadableOptions1, delete loadableOptions.webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
delete loadableOptions1.ssr;
}
return loadableFn(loadableOptions1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
};
if (dynamicOptions instanceof Promise ? loadableOptions1.loader = function() {
return dynamicOptions;
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && delete (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated)).loadableGenerated, "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, delete (loadableOptions = loadableOptions1).webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated), delete loadableOptions1.loadableGenerated), "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, loadableOptions = loadableOptions1, delete loadableOptions.webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
delete loadableOptions1.ssr;
}
return loadableFn(loadableOptions1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
};
if (dynamicOptions instanceof Promise ? loadableOptions1.loader = function() {
return dynamicOptions;
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && delete (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated)).loadableGenerated, "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, delete (loadableOptions = loadableOptions1).webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated), delete loadableOptions1.loadableGenerated), "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, loadableOptions = loadableOptions1, delete loadableOptions.webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
delete loadableOptions1.ssr;
}
return loadableFn(loadableOptions1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,8 @@
};
if (dynamicOptions instanceof Promise ? loadableOptions1.loader = function() {
return dynamicOptions;
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && delete (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated)).loadableGenerated, "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, delete (loadableOptions = loadableOptions1).webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated), delete loadableOptions1.loadableGenerated), "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, loadableOptions = loadableOptions1, delete loadableOptions.webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
delete loadableOptions1.ssr;
}
return loadableFn(loadableOptions1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
};
if (dynamicOptions instanceof Promise ? loadableOptions1.loader = function() {
return dynamicOptions;
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && delete (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated)).loadableGenerated, "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, delete (loadableOptions = loadableOptions1).webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated), delete loadableOptions1.loadableGenerated), "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, loadableOptions = loadableOptions1, delete loadableOptions.webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
delete loadableOptions1.ssr;
}
return loadableFn(loadableOptions1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
};
if (dynamicOptions instanceof Promise ? loadableOptions1.loader = function() {
return dynamicOptions;
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && delete (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated)).loadableGenerated, "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, delete (loadableOptions = loadableOptions1).webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
} : "function" == typeof dynamicOptions ? loadableOptions1.loader = dynamicOptions : "object" == typeof dynamicOptions && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), dynamicOptions)), (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), options)).loadableGenerated && (loadableOptions1 = _objectSpread(_objectSpread({}, loadableOptions1), loadableOptions1.loadableGenerated), delete loadableOptions1.loadableGenerated), "boolean" == typeof loadableOptions1.ssr) {
if (!loadableOptions1.ssr) return delete loadableOptions1.ssr, loadableOptions = loadableOptions1, delete loadableOptions.webpack, delete loadableOptions.modules, loadableFn(loadableOptions);
delete loadableOptions1.ssr;
}
return loadableFn(loadableOptions1);
Expand Down