node.definitions.forEach(function(defn) {
var def = defn.name.definition();
var_defs_by_id.add(def.id, defn);
- if (!drop_vars && !(def.id in in_use_ids)) {
+ if ((!drop_vars || (node instanceof AST_Const ? def.redefined() : def.const_redefs))
+ && !(def.id in in_use_ids)) {
in_use_ids[def.id] = true;
in_use.push(def);
}
// symbols (that may not be in_use).
tw = new TreeWalker(scan_ref_scoped);
for (var i = 0; i < in_use.length; i++) {
- var in_use_def = in_use[i];
- if (in_use_def.const_redefs) in_use_def.const_redefs.forEach(function(def) {
- if (!(def.id in in_use_ids)) {
- in_use_ids[def.id] = true;
- in_use.push(def);
- }
- });
- var init = initializations.get(in_use_def.id);
+ var init = initializations.get(in_use[i].id);
if (init) init.forEach(function(init) {
init.walk(tw);
});
}
} else if (compressor.option("functions")
&& !compressor.option("ie8")
+ && !(node instanceof AST_Const)
&& var_defs.length == 1
&& sym.assignments == 0
&& def.value instanceof AST_Function
}
// ensure compression works if `const` reuses a scope variable
if (node instanceof AST_SymbolConst) {
- var def = node.definition();
- var redef = def.redefined();
- if (redef) {
- if (!redef.const_redefs) redef.const_redefs = [];
- redef.const_redefs.push(def);
- }
+ var redef = node.definition().redefined();
+ if (redef) redef.const_redefs = true;
return true;
}
});
options = {
dead_code: true,
ie8: true,
+ passes: 2,
toplevel: true,
unused: true,
}
}
expect_stdout: "undefined"
}
+
+legacy_scope: {
+ options = {
+ toplevel: true,
+ unused: true,
+ }
+ input: {
+ {
+ const a = 42;
+ }
+ var a;
+ }
+ expect: {
+ {
+ const a = 42;
+ }
+ var a;
+ }
+ expect_stdout: true
+}
+
+issue_4191_1: {
+ options = {
+ functions: true,
+ reduce_vars: true,
+ unused: true,
+ }
+ input: {
+ {
+ const a = function() {};
+ }
+ console.log(typeof a);
+ }
+ expect: {
+ {
+ const a = function() {};
+ }
+ console.log(typeof a);
+ }
+ expect_stdout: true
+}
+
+issue_4191_2: {
+ options = {
+ functions: true,
+ reduce_vars: true,
+ toplevel: true,
+ unused: true,
+ }
+ input: {
+ const a = function() {};
+ console.log(typeof a, a());
+ }
+ expect: {
+ function a() {};
+ console.log(typeof a, a());
+ }
+ expect_stdout: "function undefined"
+}