separate keep_classnames & keep_fnames (#2510)

fixes #2418
This commit is contained in:
Alex Lam S.L 2017-11-25 16:31:52 +08:00 committed by GitHub
parent bbf38dc9c0
commit f1e3ef5262
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 113 additions and 2 deletions

View File

@ -46,6 +46,7 @@ program.option("--config-file <file>", "Read minify() options from JSON file.");
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define")); program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
program.option("--ecma <version>", "Specify ECMAScript release: 5, 6, 7 or 8."); program.option("--ecma <version>", "Specify ECMAScript release: 5, 6, 7 or 8.");
program.option("--ie8", "Support non-standard Internet Explorer 8."); program.option("--ie8", "Support non-standard Internet Explorer 8.");
program.option("--keep-classnames", "Do not mangle/drop class names.");
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name."); program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
program.option("--name-cache <file>", "File to hold mangled name mappings."); program.option("--name-cache <file>", "File to hold mangled name mappings.");
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)"); program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
@ -95,6 +96,9 @@ if (program.define) {
options.compress.global_defs[expr] = program.define[expr]; options.compress.global_defs[expr] = program.define[expr];
} }
} }
if (program.keepClassnames) {
options.keep_classnames = true;
}
if (program.keepFnames) { if (program.keepFnames) {
options.keep_fnames = true; options.keep_fnames = true;
} }

View File

@ -69,6 +69,7 @@ function Compressor(options, false_by_default) {
if_return : !false_by_default, if_return : !false_by_default,
inline : !false_by_default, inline : !false_by_default,
join_vars : !false_by_default, join_vars : !false_by_default,
keep_classnames: false,
keep_fargs : true, keep_fargs : true,
keep_fnames : false, keep_fnames : false,
keep_infinity : false, keep_infinity : false,
@ -2610,8 +2611,9 @@ merge(Compressor.prototype, {
// pass 3: we should drop declarations not in_use // pass 3: we should drop declarations not in_use
var tt = new TreeTransformer( var tt = new TreeTransformer(
function before(node, descend, in_list) { function before(node, descend, in_list) {
if (!compressor.option("keep_fnames") if (node.name
&& node.name && (node instanceof AST_Function || node instanceof AST_ClassExpression)) { && (!compressor.option("keep_classnames") && node instanceof AST_ClassExpression
|| !compressor.option("keep_fnames") && node instanceof AST_Function)) {
var def = node.name.definition(); var def = node.name.definition();
// any declarations with same name will overshadow // any declarations with same name will overshadow
// name of this anonymous function and can therefore // name of this anonymous function and can therefore

View File

@ -51,6 +51,7 @@ function minify(files, options) {
compress: {}, compress: {},
ecma: undefined, ecma: undefined,
ie8: false, ie8: false,
keep_classnames: undefined,
keep_fnames: false, keep_fnames: false,
mangle: {}, mangle: {},
nameCache: null, nameCache: null,
@ -65,8 +66,12 @@ function minify(files, options) {
var timings = options.timings && { var timings = options.timings && {
start: Date.now() start: Date.now()
}; };
if (options.keep_classnames === undefined) {
options.keep_classnames = options.keep_fnames;
}
set_shorthand("ecma", options, [ "parse", "compress", "output" ]); set_shorthand("ecma", options, [ "parse", "compress", "output" ]);
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]); set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
set_shorthand("keep_classnames", options, [ "compress", "mangle" ]);
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]); set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
set_shorthand("toplevel", options, [ "compress", "mangle" ]); set_shorthand("toplevel", options, [ "compress", "mangle" ]);
set_shorthand("warnings", options, [ "compress" ]); set_shorthand("warnings", options, [ "compress" ]);

View File

@ -1574,3 +1574,101 @@ issue_2288: {
} }
} }
} }
issue_2418_1: {
options = {
unused: true,
}
input: {
class C {}
function F() {}
(class c {});
(function f() {});
}
expect: {
class C {}
function F() {}
(class {});
(function() {});
}
}
issue_2418_2: {
options = {
keep_classnames: false,
keep_fnames: false,
unused: true,
}
input: {
class C {}
function F() {}
(class c {});
(function f() {});
}
expect: {
class C {}
function F() {}
(class {});
(function() {});
}
}
issue_2418_3: {
options = {
keep_classnames: false,
keep_fnames: true,
unused: true,
}
input: {
class C {}
function F() {}
(class c {});
(function f() {});
}
expect: {
class C {}
function F() {}
(class {});
(function f() {});
}
}
issue_2418_4: {
options = {
keep_classnames: true,
keep_fnames: false,
unused: true,
}
input: {
class C {}
function F() {}
(class c {});
(function f() {});
}
expect: {
class C {}
function F() {}
(class c {});
(function() {});
}
}
issue_2418_5: {
options = {
keep_classnames: true,
keep_fnames: true,
unused: true,
}
input: {
class C {}
function F() {}
(class c {});
(function f() {});
}
expect: {
class C {}
function F() {}
(class c {});
(function f() {});
}
}

View File

@ -389,6 +389,7 @@ hoist_class: {
evaluate: true, evaluate: true,
hoist_props: true, hoist_props: true,
inline: true, inline: true,
keep_classnames: true,
keep_fnames: true, keep_fnames: true,
passes: 2, passes: 2,
reduce_funcs: true, reduce_funcs: true,
@ -432,6 +433,7 @@ hoist_class_with_new: {
evaluate: true, evaluate: true,
hoist_props: true, hoist_props: true,
inline: true, inline: true,
keep_classnames: true,
keep_fnames: true, keep_fnames: true,
passes: 2, passes: 2,
reduce_funcs: true, reduce_funcs: true,