From: Alex Lam S.L Date: Tue, 27 Oct 2020 09:39:33 +0000 (+0000) Subject: improve warnings (#4247) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=79e5c3f5645b339a98d73cb78e356f61fa618929;p=UglifyJS.git improve warnings (#4247) closes #4244 --- diff --git a/bin/uglifyjs b/bin/uglifyjs index c6062657..618b88da 100755 --- a/bin/uglifyjs +++ b/bin/uglifyjs @@ -276,7 +276,9 @@ function convert_ast(fn) { function run() { var content = options.sourceMap && options.sourceMap.content; if (content && content != "inline") { - UglifyJS.AST_Node.info("Using input source map: " + content); + UglifyJS.AST_Node.info("Using input source map: {content}", { + content : content, + }); options.sourceMap.content = read_file(content, content); } try { diff --git a/lib/ast.js b/lib/ast.js index a87e9c58..ad58ec21 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -137,17 +137,17 @@ var AST_Node = DEFNODE("Node", "start end", { }, null); (AST_Node.log_function = function(fn, verbose) { - var printed = Object.create(null); - if (fn) { - AST_Node.info = verbose ? function(text, props) { - log("INFO: " + string_template(text, props)); - } : noop; - AST_Node.warn = function(text, props) { - log("WARN: " + string_template(text, props)); - }; - } else { + if (!fn) { AST_Node.info = AST_Node.warn = noop; + return; } + var printed = Object.create(null); + AST_Node.info = verbose ? function(text, props) { + log("INFO: " + string_template(text, props)); + } : noop; + AST_Node.warn = function(text, props) { + log("WARN: " + string_template(text, props)); + }; function log(msg) { if (printed[msg]) return; diff --git a/lib/compress.js b/lib/compress.js index d8f689c3..822e0507 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -192,7 +192,11 @@ merge(Compressor.prototype, { node.walk(new TreeWalker(function() { count++; })); - AST_Node.info("pass " + pass + ": last_count: " + min_count + ", count: " + count); + AST_Node.info("pass {pass}: last_count: {min_count}, count: {count}", { + pass: pass, + min_count: min_count, + count: count, + }); if (count < min_count) { min_count = count; stopping = false; @@ -1340,11 +1344,11 @@ merge(Compressor.prototype, { replaced++; } CHANGED = abort = true; - AST_Node.info("Collapsing {name} [{file}:{line},{col}]", { - name: node.print_to_string(), + AST_Node.info("Collapsing {node} [{file}:{line},{col}]", { + node: node, file: node.start.file, line: node.start.line, - col: node.start.col + col: node.start.col, }); if (candidate instanceof AST_UnaryPostfix) { if (lhs instanceof AST_SymbolRef) lhs.definition().fixed = false; @@ -2799,14 +2803,15 @@ merge(Compressor.prototype, { } function extract_declarations_from_unreachable_code(compressor, stat, target) { - if (!(stat instanceof AST_Defun)) { + if (!(stat instanceof AST_Definitions || stat instanceof AST_Defun)) { AST_Node.warn("Dropping unreachable code [{file}:{line},{col}]", stat.start); } var block; stat.walk(new TreeWalker(function(node, descend) { if (node instanceof AST_Definitions) { - AST_Node.warn("Declarations in unreachable code! [{file}:{line},{col}]", node.start); - node.remove_initializers(compressor); + if (node.remove_initializers(compressor)) { + AST_Node.warn("Dropping initialization in unreachable code [{file}:{line},{col}]", node.start); + } push(node); return true; } @@ -3273,7 +3278,12 @@ merge(Compressor.prototype, { } function warn(node) { - AST_Node.warn("global_defs " + node.print_to_string() + " redefined [{file}:{line},{col}]", node.start); + AST_Node.warn("global_defs {node} redefined [{file}:{line},{col}]", { + node: node, + file: node.start.file, + line: node.start.line, + col: node.start.col, + }); } AST_Toplevel.DEFMETHOD("resolve_defines", function(compressor) { @@ -3878,10 +3888,10 @@ merge(Compressor.prototype, { return val[key].apply(val, args); } catch (ex) { AST_Node.warn("Error evaluating {code} [{file}:{line},{col}]", { - code: this.print_to_string(), + code: this, file: this.start.file, line: this.start.line, - col: this.start.col + col: this.start.col, }); } finally { if (val instanceof RegExp) val.lastIndex = 0; @@ -4992,7 +5002,7 @@ merge(Compressor.prototype, { var old_def, var_defs = var_defs_by_id.get(sym.id); if (!def.value) { if (var_defs.length > 1) { - AST_Node.warn("Dropping duplicated declaration of variable {name} [{file}:{line},{col}]", template(def.name)); + AST_Node.info("Dropping declaration of variable {name} [{file}:{line},{col}]", template(def.name)); remove(var_defs, def); sym.eliminated++; } else { @@ -5226,7 +5236,7 @@ merge(Compressor.prototype, { name: sym.name, file: sym.start.file, line: sym.start.line, - col : sym.start.col + col : sym.start.col, }; } @@ -6662,19 +6672,21 @@ merge(Compressor.prototype, { this.definitions.forEach(function(def) { def.value = make_node(AST_Undefined, def).optimize(compressor); }); + return true; }); - AST_Let.DEFMETHOD("remove_initializers", function() { + function remove_initializers() { + var CHANGED = false; this.definitions.forEach(function(def) { + if (!def.value) return; def.value = null; + CHANGED = true; }); - }); + return CHANGED; + } - AST_Var.DEFMETHOD("remove_initializers", function() { - this.definitions.forEach(function(def) { - def.value = null; - }); - }); + AST_Let.DEFMETHOD("remove_initializers", remove_initializers); + AST_Var.DEFMETHOD("remove_initializers", remove_initializers); AST_Definitions.DEFMETHOD("to_assignments", function(compressor) { var reduce_vars = compressor.option("reduce_vars"); @@ -6827,7 +6839,7 @@ merge(Compressor.prototype, { length: length, file: self.start.file, line: self.start.line, - col: self.start.col + col: self.start.col, }); break; } @@ -6884,10 +6896,10 @@ merge(Compressor.prototype, { })); } catch (ex) { AST_Node.warn("Error converting {expr} [{file}:{line},{col}]", { - expr: self.print_to_string(), + expr: self, file: self.start.file, line: self.start.line, - col: self.start.col + col: self.start.col, }); } } @@ -9302,7 +9314,7 @@ merge(Compressor.prototype, { prop: self.property, file: self.start.file, line: self.start.line, - col: self.start.col + col: self.start.col, }); } var parent = compressor.parent(); diff --git a/lib/minify.js b/lib/minify.js index c264f695..5f363989 100644 --- a/lib/minify.js +++ b/lib/minify.js @@ -33,7 +33,9 @@ function read_source_map(name, toplevel) { return to_ascii(match[2]); } } - AST_Node.warn("inline source map not found: " + name); + AST_Node.warn("inline source map not found: {name}", { + name: name, + }); } function parse_source_map(content) { @@ -258,6 +260,7 @@ function minify(files, options) { } catch (ex) { return { error: ex }; } finally { + AST_Node.log_function(); AST_Node.disable_validation(); } } diff --git a/lib/utils.js b/lib/utils.js index 2f5a4866..2a0df8c5 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -143,8 +143,9 @@ function push_uniq(array, el) { } function string_template(text, props) { - return text.replace(/\{(.+?)\}/g, function(str, p) { - return props && props[p]; + return text.replace(/\{([^}]+)\}/g, function(str, p) { + var value = props[p]; + return value instanceof AST_Node ? value.print_to_string() : value; }); } diff --git a/test/compress.js b/test/compress.js index 3d9b1a63..eda9b7b7 100644 --- a/test/compress.js +++ b/test/compress.js @@ -315,6 +315,7 @@ function test_case(test) { if (test.mangle.properties) U.mangle_properties(output, test.mangle.properties); } var output_code = make_code(output, output_options); + U.AST_Node.log_function(); if (expect != output_code) { log([ "!!! failed", diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index 8a4e3aad..64088eb2 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -83,13 +83,11 @@ ifs_3_should_warn: { "WARN: Condition left of && always false [test/compress/conditionals.js:3,12]", "WARN: Condition always false [test/compress/conditionals.js:3,12]", "WARN: Dropping unreachable code [test/compress/conditionals.js:3,34]", - "WARN: Declarations in unreachable code! [test/compress/conditionals.js:4,12]", "WARN: + in boolean context always true [test/compress/conditionals.js:10,19]", "WARN: Boolean || always true [test/compress/conditionals.js:10,12]", "WARN: Condition left of || always true [test/compress/conditionals.js:10,12]", "WARN: Condition always true [test/compress/conditionals.js:10,12]", "WARN: Dropping unreachable code [test/compress/conditionals.js:12,15]", - "WARN: Declarations in unreachable code! [test/compress/conditionals.js:13,12]", "WARN: Dropping side-effect-free statement [test/compress/conditionals.js:3,12]", "WARN: Dropping side-effect-free statement [test/compress/conditionals.js:10,12]", ] diff --git a/test/compress/dead-code.js b/test/compress/dead-code.js index 3a5a4527..62efa460 100644 --- a/test/compress/dead-code.js +++ b/test/compress/dead-code.js @@ -61,8 +61,6 @@ dead_code_2_should_warn: { expect_stdout: true expect_warnings: [ "WARN: Dropping unreachable code [test/compress/dead-code.js:8,12]", - "WARN: Declarations in unreachable code! [test/compress/dead-code.js:10,16]", - "WARN: Dropping unreachable code [test/compress/dead-code.js:10,16]", ] node_version: "<=4" } @@ -103,11 +101,9 @@ dead_code_constant_boolean_should_warn_more: { "WARN: + in boolean context always true [test/compress/dead-code.js:1,33]", "WARN: Boolean || always true [test/compress/dead-code.js:1,16]", "WARN: Dropping unreachable code [test/compress/dead-code.js:1,45]", - "WARN: Declarations in unreachable code! [test/compress/dead-code.js:3,12]", "WARN: Boolean expression always true [test/compress/dead-code.js:6,47]", "WARN: Boolean && always false [test/compress/dead-code.js:6,28]", "WARN: Dropping unreachable code [test/compress/dead-code.js:6,63]", - "WARN: Declarations in unreachable code! [test/compress/dead-code.js:9,12]", "WARN: Dropping side-effect-free statement [test/compress/dead-code.js:1,15]", "WARN: Dropping side-effect-free statement [test/compress/dead-code.js:6,28]", ] diff --git a/test/compress/issue-1034.js b/test/compress/issue-1034.js index db488d05..e1abad7c 100644 --- a/test/compress/issue-1034.js +++ b/test/compress/issue-1034.js @@ -39,7 +39,7 @@ non_hoisted_function_after_return: { "WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]", - "WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:11,21]" + "WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:11,21]", ] } @@ -84,15 +84,12 @@ non_hoisted_function_after_return_2a: { } } expect_warnings: [ - "WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:4,16]", - "WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:7,16]", + "WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:4,16]", + "WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:7,16]", "WARN: Dropping unused variable a [test/compress/issue-1034.js:4,20]", "WARN: Dropping unused function nope [test/compress/issue-1034.js:11,21]", "INFO: pass 0: last_count: Infinity, count: 35", - "WARN: Dropping unreachable code [test/compress/issue-1034.js:9,12]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:9,12]", + "WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:9,12]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]", "INFO: Dropping unused variable b [test/compress/issue-1034.js:7,20]", "INFO: Dropping unused variable c [test/compress/issue-1034.js:9,16]", @@ -138,10 +135,7 @@ non_hoisted_function_after_return_2b: { } } expect_warnings: [ - "WARN: Dropping unreachable code [test/compress/issue-1034.js:6,16]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:6,16]", - "WARN: Dropping unreachable code [test/compress/issue-1034.js:8,12]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:8,12]", + "WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:8,12]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]", ] } @@ -242,15 +236,12 @@ non_hoisted_function_after_return_2a_strict: { } expect_stdout: "5 6" expect_warnings: [ - "WARN: Dropping unreachable code [test/compress/issue-1034.js:5,16]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:5,16]", - "WARN: Dropping unreachable code [test/compress/issue-1034.js:8,16]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:8,16]", + "WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:5,16]", + "WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:8,16]", "WARN: Dropping unused variable a [test/compress/issue-1034.js:5,20]", "WARN: Dropping unused function nope [test/compress/issue-1034.js:12,21]", "INFO: pass 0: last_count: Infinity, count: 46", - "WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:10,12]", + "WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:10,12]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]", "INFO: Dropping unused variable b [test/compress/issue-1034.js:8,20]", "INFO: Dropping unused variable c [test/compress/issue-1034.js:10,16]", @@ -301,10 +292,7 @@ non_hoisted_function_after_return_2b_strict: { } expect_stdout: "5 6" expect_warnings: [ - "WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:7,16]", - "WARN: Dropping unreachable code [test/compress/issue-1034.js:9,12]", - "WARN: Declarations in unreachable code! [test/compress/issue-1034.js:9,12]", + "WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:9,12]", "WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]", ] }