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 {
}, 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;
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;
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;
}
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;
}
}
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) {
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;
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 {
name: sym.name,
file: sym.start.file,
line: sym.start.line,
- col : sym.start.col
+ col : sym.start.col,
};
}
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");
length: length,
file: self.start.file,
line: self.start.line,
- col: self.start.col
+ col: self.start.col,
});
break;
}
}));
} 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,
});
}
}
prop: self.property,
file: self.start.file,
line: self.start.line,
- col: self.start.col
+ col: self.start.col,
});
}
var parent = compressor.parent();
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) {
} catch (ex) {
return { error: ex };
} finally {
+ AST_Node.log_function();
AST_Node.disable_validation();
}
}
}
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;
});
}
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",
"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]",
]
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"
}
"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]",
]
"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]",
]
}
}
}
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]",
}
}
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]",
]
}
}
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]",
}
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]",
]
}