@@ -507,6 +507,7 @@ Compressor.prototype.compress = function(node) {
507507 if (parent instanceof AST_Call) return parent.expression !== node || parent instanceof AST_New;
508508 if (parent instanceof AST_ClassField) return parent.value === node && !parent.static;
509509 if (parent instanceof AST_Exit) return parent.value === node && scope.resolve() !== d.scope.resolve();
510+ if (parent instanceof AST_ExportReferences) return true;
510511 if (parent instanceof AST_VarDef) return parent.value === node;
511512 }
512513
@@ -2143,12 +2144,16 @@ Compressor.prototype.compress = function(node) {
21432144 if (sequencesize_2(statements, compressor)) changed = 7;
21442145 if (!changed && last_changed == 7) break;
21452146 }
2146- if (compressor.option("join_vars ")) {
2147- if (join_consecutive_vars (statements)) changed = 8;
2147+ if (compressor.option("arrows") && compressor.option("module ")) {
2148+ if (arrowify (statements)) changed = 8;
21482149 if (!changed && last_changed == 8) break;
21492150 }
2151+ if (compressor.option("join_vars")) {
2152+ if (join_consecutive_vars(statements)) changed = 9;
2153+ if (!changed && last_changed == 9) break;
2154+ }
21502155 if (compressor.option("collapse_vars")) {
2151- if (collapse(statements, compressor)) changed = 9 ;
2156+ if (collapse(statements, compressor)) changed = 10 ;
21522157 }
21532158 } while (changed && max_iter-- > 0);
21542159 return statements;
@@ -4253,6 +4258,48 @@ Compressor.prototype.compress = function(node) {
42534258 }
42544259 }
42554260
4261+ function arrowify(statements) {
4262+ var changed = false, defns = [], len = 0;
4263+ statements.forEach(function(stat) {
4264+ var def;
4265+ if ((stat instanceof AST_AsyncDefun || stat instanceof AST_Defun)
4266+ && !stat.uses_arguments
4267+ && !stat.pinned()
4268+ && (def = stat.name.definition()).escaped
4269+ && def.escaped.depth != 1
4270+ && !compressor.exposed(def)
4271+ && !stat.contains_this()) {
4272+ var name = make_node(AST_SymbolVar, stat.name);
4273+ var arrow = make_node(is_async(stat) ? AST_AsyncArrow : AST_Arrow, stat);
4274+ arrow.init_vars(stat.parent_scope, stat);
4275+ arrow.variables.del("arguments");
4276+ var defn = make_node(AST_VarDef, stat, {
4277+ name: name,
4278+ value: arrow,
4279+ });
4280+ defns.push(defn);
4281+ def.orig.push(name);
4282+ def.eliminated++;
4283+ if (def.fixed) {
4284+ var fixed = function() {
4285+ return defn.value;
4286+ };
4287+ fixed.assigns = [ defn ];
4288+ if (def.fixed === stat) def.fixed = fixed;
4289+ def.references.forEach(function(node) {
4290+ if (node.fixed === stat) node.fixed = fixed;
4291+ });
4292+ }
4293+ changed = true;
4294+ } else {
4295+ statements[len++] = stat;
4296+ }
4297+ });
4298+ statements.length = len;
4299+ if (defns.length > 0) statements.unshift(make_node(AST_Var, compressor.self(), { definitions: defns }));
4300+ return changed;
4301+ }
4302+
42564303 function extract_exprs(body) {
42574304 if (body instanceof AST_Assign) return [ body ];
42584305 if (body instanceof AST_Sequence) return body.expressions.slice();
@@ -11139,7 +11186,7 @@ Compressor.prototype.compress = function(node) {
1113911186 && !exp.uses_arguments
1114011187 && !exp.pinned()
1114111188 && !exp.contains_this()) {
11142- var arrow = make_node(is_async(exp) ? AST_AsyncArrow : AST_Arrow, exp, exp );
11189+ var arrow = make_node(is_async(exp) ? AST_AsyncArrow : AST_Arrow, exp);
1114311190 arrow.init_vars(exp.parent_scope, exp);
1114411191 arrow.variables.del("arguments");
1114511192 self.expression = arrow.transform(compressor);
@@ -12808,50 +12855,49 @@ Compressor.prototype.compress = function(node) {
1280812855 var value;
1280912856 if (def.recursive_refs > 0) {
1281012857 value = fixed.clone(true);
12811- var defun_def = value.name.definition();
12812- var lambda_def = value.variables.get(value.name.name);
12858+ var lambda_def = value.variables.get(self.name);
1281312859 var name = lambda_def && lambda_def.orig[0];
1281412860 var def_fn_name, symbol_type;
1281512861 if (value instanceof AST_Class) {
1281612862 def_fn_name = "def_function";
1281712863 symbol_type = AST_SymbolClass;
1281812864 } else {
1281912865 def_fn_name = "def_variable";
12820- symbol_type = AST_SymbolLambda;
12866+ symbol_type = value.name ? AST_SymbolLambda : AST_SymbolVar ;
1282112867 }
1282212868 if (!(name instanceof symbol_type)) {
1282312869 name = make_node(symbol_type, value.name);
1282412870 name.scope = value;
12825- value.name = name;
12871+ if (value.name) value.name = name;
1282612872 lambda_def = value[def_fn_name](name);
1282712873 lambda_def.recursive_refs = def.recursive_refs;
1282812874 }
1282912875 value.walk(new TreeWalker(function(node) {
1283012876 if (node instanceof AST_SymbolDeclaration) {
1283112877 if (node !== name) {
12832- var def = node.definition();
12833- def .orig.push(node);
12834- def .eliminated++;
12878+ var d = node.definition();
12879+ d .orig.push(node);
12880+ d .eliminated++;
1283512881 }
1283612882 return;
1283712883 }
1283812884 if (!(node instanceof AST_SymbolRef)) return;
12839- var def = node.definition();
12840- if (def === defun_def ) {
12841- node.thedef = def = lambda_def;
12885+ var d = node.definition();
12886+ if (d === def ) {
12887+ node.thedef = d = lambda_def;
1284212888 } else {
12843- def .single_use = false;
12889+ d .single_use = false;
1284412890 var fn = node.fixed_value();
1284512891 if (is_lambda(fn)
1284612892 && fn.name
12847- && fn.name.definition() === def
12848- && def .scope === fn.name.scope
12849- && fixed.variables.get(fn.name.name) === def ) {
12893+ && fn.name.definition() === d
12894+ && d .scope === fn.name.scope
12895+ && fixed.variables.get(fn.name.name) === d ) {
1285012896 fn.name = fn.name.clone();
12851- node.thedef = def = value.variables.get(fn.name.name) || value[def_fn_name](fn.name);
12897+ node.thedef = d = value.variables.get(fn.name.name) || value[def_fn_name](fn.name);
1285212898 }
1285312899 }
12854- def .references.push(node);
12900+ d .references.push(node);
1285512901 }));
1285612902 } else {
1285712903 if (fixed instanceof AST_Scope) {
0 commit comments