From: Mihai Bazon Date: Wed, 10 Oct 2012 08:26:59 +0000 (+0300) Subject: add `--lint` and display {file} in scope_warnings X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=3799ac8973bb0bd08efe7a2af27808e5917183cc;p=UglifyJS.git add `--lint` and display {file} in scope_warnings --- diff --git a/bin/uglifyjs2 b/bin/uglifyjs2 index e69ed5cf..62f59105 100755 --- a/bin/uglifyjs2 +++ b/bin/uglifyjs2 @@ -47,6 +47,7 @@ because of dead code removal or cascading statements into sequences.") .describe("wrap", "Embed everything in a big function, making the “exports” and “global” variables available. \ You need to pass an argument to this option to specify the name that your module will take when included in, say, a browser.") .describe("export-all", "Only used when --wrap, this tells UglifyJS to add code to automatically export all globals.") + .describe("lint", "Display some scope warnings") .describe("v", "Verbose") .alias("p", "prefix") @@ -72,6 +73,7 @@ You need to pass an argument to this option to specify the name that your module .boolean("stats") .boolean("acorn") .boolean("spidermonkey") + .boolean("lint") .wrap(80) @@ -229,11 +231,14 @@ if (ARGS.wrap) { TOPLEVEL = TOPLEVEL.wrap_commonjs(ARGS.wrap, ARGS.export_all); } -var SCOPE_IS_NEEDED = COMPRESS || MANGLE; +var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint; if (SCOPE_IS_NEEDED) { time_it("scope", function(){ TOPLEVEL.figure_out_scope(); + if (ARGS.lint) { + TOPLEVEL.scope_warnings(); + } }); } diff --git a/lib/scope.js b/lib/scope.js index f705428e..7edce0e5 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -500,8 +500,9 @@ AST_Toplevel.DEFMETHOD("scope_warnings", function(options){ // XXX: this also warns about JS standard names, // i.e. Object, Array, parseInt etc. Should add a list of // exceptions. - AST_Node.warn("Undeclared symbol: {name} [{line},{col}]", { + AST_Node.warn("Undeclared symbol: {name} [{file}:{line},{col}]", { name: node.name, + file: node.start.file, line: node.start.line, col: node.start.col }); @@ -516,9 +517,10 @@ AST_Toplevel.DEFMETHOD("scope_warnings", function(options){ if (sym && (sym.undeclared() || (sym.global() && sym.scope !== sym.definition().scope))) { - AST_Node.warn("{msg}: {name} [{line},{col}]", { + AST_Node.warn("{msg}: {name} [{file}:{line},{col}]", { msg: sym.undeclared() ? "Accidental global?" : "Assignment to global", name: sym.name, + file: sym.start.file, line: sym.start.line, col: sym.start.col }); @@ -528,14 +530,15 @@ AST_Toplevel.DEFMETHOD("scope_warnings", function(options){ && node instanceof AST_SymbolRef && node.undeclared() && node.name == "eval") { - AST_Node.warn("Eval is used [{line},{col}]", node.start); + AST_Node.warn("Eval is used [{file}:{line},{col}]", node.start); } if (options.unreferenced && node instanceof AST_SymbolDeclaration && node.unreferenced()) { - AST_Node.warn("{type} {name} is declared but not referenced [{line},{col}]", { + AST_Node.warn("{type} {name} is declared but not referenced [{file}:{line},{col}]", { type: node instanceof AST_Label ? "Label" : "Symbol", name: node.name, + file: node.start.file, line: node.start.line, col: node.start.col }); @@ -543,8 +546,9 @@ AST_Toplevel.DEFMETHOD("scope_warnings", function(options){ if (options.func_arguments && node instanceof AST_Lambda && node.uses_arguments) { - AST_Node.warn("arguments used in function {name} [{line},{col}]", { + AST_Node.warn("arguments used in function {name} [{file}:{line},{col}]", { name: node.name ? node.name.name : "anonymous", + file: node.start.file, line: node.start.line, col: node.start.col }); @@ -552,8 +556,10 @@ AST_Toplevel.DEFMETHOD("scope_warnings", function(options){ if (options.nested_defuns && node instanceof AST_Defun && !(tw.parent() instanceof AST_Scope)) { - AST_Node.warn("Function {name} declared in nested statement [{line},{col}]", { + AST_Node.warn("Function {name} declared in nested statement \"{type}\" [{file}:{line},{col}]", { name: node.name.name, + type: tw.parent().TYPE, + file: node.start.file, line: node.start.line, col: node.start.col });