aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/ast.js59
-rw-r--r--lib/compress.js27
-rw-r--r--lib/minify.js146
-rw-r--r--lib/output.js10
-rw-r--r--lib/parse.js2
-rw-r--r--lib/propmangle.js52
-rw-r--r--lib/scope.js109
7 files changed, 206 insertions, 199 deletions
diff --git a/lib/ast.js b/lib/ast.js
index f78ac576..0fa051b8 100644
--- a/lib/ast.js
+++ b/lib/ast.js
@@ -325,62 +325,13 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
$propdoc: {
globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
},
- wrap_enclose: function(arg_parameter_pairs) {
- var self = this;
- var args = [];
- var parameters = [];
-
- arg_parameter_pairs.forEach(function(pair) {
- var splitAt = pair.lastIndexOf(":");
-
- args.push(pair.substr(0, splitAt));
- parameters.push(pair.substr(splitAt + 1));
- });
-
- var wrapped_tl = "(function(" + parameters.join(",") + "){ '$ORIG'; })(" + args.join(",") + ")";
+ wrap_commonjs: function(name) {
+ var body = this.body;
+ var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");";
wrapped_tl = parse(wrapped_tl);
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
if (node instanceof AST_Directive && node.value == "$ORIG") {
- return MAP.splice(self.body);
- }
- }));
- return wrapped_tl;
- },
- wrap_commonjs: function(name, export_all) {
- var self = this;
- var to_export = [];
- if (export_all) {
- self.figure_out_scope();
- self.walk(new TreeWalker(function(node){
- if (node instanceof AST_SymbolDeclaration && node.definition().global) {
- if (!find_if(function(n){ return n.name == node.name }, to_export))
- to_export.push(node);
- }
- }));
- }
- var wrapped_tl = "(function(exports, global){ '$ORIG'; '$EXPORTS'; global['" + name + "'] = exports; }({}, (function(){return this}())))";
- wrapped_tl = parse(wrapped_tl);
- wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
- if (node instanceof AST_Directive) {
- switch (node.value) {
- case "$ORIG":
- return MAP.splice(self.body);
- case "$EXPORTS":
- var body = [];
- to_export.forEach(function(sym){
- body.push(new AST_SimpleStatement({
- body: new AST_Assign({
- left: new AST_Sub({
- expression: new AST_SymbolRef({ name: "exports" }),
- property: new AST_String({ value: sym.name }),
- }),
- operator: "=",
- right: new AST_SymbolRef(sym),
- }),
- }));
- });
- return MAP.splice(body);
- }
+ return MAP.splice(body);
}
}));
return wrapped_tl;
@@ -929,7 +880,7 @@ TreeWalker.prototype = {
parent: function(n) {
return this.stack[this.stack.length - 2 - (n || 0)];
},
- push: function (node) {
+ push: function(node) {
if (node instanceof AST_Lambda) {
this.directives = Object.create(this.directives);
} else if (node instanceof AST_Directive && !this.directives[node.value]) {
diff --git a/lib/compress.js b/lib/compress.js
index 5128abb2..c8b15ffc 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -61,6 +61,7 @@ function Compressor(options, false_by_default) {
global_defs : {},
hoist_funs : !false_by_default,
hoist_vars : false,
+ ie8 : false,
if_return : !false_by_default,
join_vars : !false_by_default,
keep_fargs : true,
@@ -73,7 +74,6 @@ function Compressor(options, false_by_default) {
pure_getters : !false_by_default && "strict",
pure_funcs : null,
reduce_vars : !false_by_default,
- screw_ie8 : true,
sequences : !false_by_default,
side_effects : !false_by_default,
switches : !false_by_default,
@@ -84,7 +84,7 @@ function Compressor(options, false_by_default) {
unsafe_math : false,
unsafe_proto : false,
unused : !false_by_default,
- warnings : true,
+ warnings : false,
}, true);
var pure_funcs = this.options["pure_funcs"];
if (typeof pure_funcs == "function") {
@@ -1138,7 +1138,7 @@ merge(Compressor.prototype, {
/* -----[ boolean/negation helpers ]----- */
// methods to determine whether an expression has a boolean result type
- (function (def){
+ (function(def){
var unary_bool = [ "!", "delete" ];
var binary_bool = [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ];
def(AST_Node, return_false);
@@ -1166,7 +1166,7 @@ merge(Compressor.prototype, {
});
// methods to determine if an expression has a numeric result type
- (function (def){
+ (function(def){
def(AST_Node, return_false);
def(AST_Number, return_true);
var unary = makePredicate("+ - ~ ++ --");
@@ -1194,7 +1194,7 @@ merge(Compressor.prototype, {
});
// methods to determine if an expression has a string result type
- (function (def){
+ (function(def){
def(AST_Node, return_false);
def(AST_String, return_true);
def(AST_UnaryPrefix, function(){
@@ -1224,7 +1224,7 @@ merge(Compressor.prototype, {
if (parent instanceof AST_Assign && parent.left === node) return node;
}
- (function (def){
+ (function(def){
AST_Node.DEFMETHOD("resolve_defines", function(compressor) {
if (!compressor.option("global_defs")) return;
var def = this._find_defs(compressor, "");
@@ -1305,7 +1305,7 @@ merge(Compressor.prototype, {
}
// methods to evaluate a constant expression
- (function (def){
+ (function(def){
// If the node has been successfully reduced to a constant,
// then its value is returned; otherwise the element itself
// is returned.
@@ -2767,10 +2767,11 @@ merge(Compressor.prototype, {
return arg.value;
}).join(",") + "){" + self.args[self.args.length - 1].value + "})()";
var ast = parse(code);
- ast.figure_out_scope({ screw_ie8: compressor.option("screw_ie8") });
+ var mangle = { ie8: compressor.option("ie8") };
+ ast.figure_out_scope(mangle);
var comp = new Compressor(compressor.options);
ast = ast.transform(comp);
- ast.figure_out_scope({ screw_ie8: compressor.option("screw_ie8") });
+ ast.figure_out_scope(mangle);
ast.mangle_names();
var fun;
try {
@@ -3216,7 +3217,7 @@ merge(Compressor.prototype, {
&& self.right.operator == "typeof") {
var expr = self.right.expression;
if (expr instanceof AST_SymbolRef ? !expr.undeclared()
- : !(expr instanceof AST_PropAccess) || compressor.option("screw_ie8")) {
+ : !(expr instanceof AST_PropAccess && compressor.option("ie8"))) {
self.right = expr;
self.left = make_node(AST_Undefined, self.left).optimize(compressor);
if (self.operator.length == 2) self.operator += "=";
@@ -3540,7 +3541,7 @@ merge(Compressor.prototype, {
return def.optimize(compressor);
}
// testing against !self.scope.uses_with first is an optimization
- if (compressor.option("screw_ie8")
+ if (!compressor.option("ie8")
&& self.undeclared()
&& (!self.scope.uses_with || !compressor.find_parent(AST_With))) {
switch (self.name) {
@@ -3860,7 +3861,7 @@ merge(Compressor.prototype, {
var prop = self.property;
if (prop instanceof AST_String && compressor.option("properties")) {
prop = prop.getValue();
- if (RESERVED_WORDS(prop) ? compressor.option("screw_ie8") : is_identifier_string(prop)) {
+ if (RESERVED_WORDS(prop) ? !compressor.option("ie8") : is_identifier_string(prop)) {
return make_node(AST_Dot, self, {
expression : self.expression,
property : prop
@@ -3887,7 +3888,7 @@ merge(Compressor.prototype, {
return def.optimize(compressor);
}
var prop = self.property;
- if (RESERVED_WORDS(prop) && !compressor.option("screw_ie8")) {
+ if (RESERVED_WORDS(prop) && compressor.option("ie8")) {
return make_node(AST_Sub, self, {
expression : self.expression,
property : make_node(AST_String, self, {
diff --git a/lib/minify.js b/lib/minify.js
new file mode 100644
index 00000000..fe762db6
--- /dev/null
+++ b/lib/minify.js
@@ -0,0 +1,146 @@
+"use strict";
+
+var to_ascii = typeof atob == "undefined" ? function(b64) {
+ return new Buffer(b64, "base64").toString();
+} : atob;
+var to_base64 = typeof btoa == "undefined" ? function(str) {
+ return new Buffer(str).toString("base64");
+} : btoa;
+
+function read_source_map(code) {
+ var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);
+ if (!match) {
+ AST_Node.warn("inline source map not found");
+ return null;
+ }
+ return to_ascii(match[2]);
+}
+
+function set_shorthand(name, options, keys) {
+ if (options[name]) {
+ keys.forEach(function(key) {
+ if (options[key]) {
+ if (typeof options[key] != "object") options[key] = {};
+ if (!(name in options[key])) options[key][name] = options[name];
+ }
+ });
+ }
+}
+
+function minify(files, options) {
+ var warn_function = AST_Node.warn_function;
+ try {
+ if (typeof files == "string") {
+ files = [ files ];
+ }
+ options = defaults(options, {
+ compress: {},
+ ie8: false,
+ keep_fnames: false,
+ mangle: {},
+ output: {},
+ parse: {},
+ sourceMap: false,
+ toplevel: false,
+ warnings: false,
+ wrap: false,
+ }, true);
+ set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
+ set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
+ set_shorthand("toplevel", options, [ "compress", "mangle" ]);
+ set_shorthand("warnings", options, [ "compress" ]);
+ if (options.mangle) {
+ options.mangle = defaults(options.mangle, {
+ cache: null,
+ eval: false,
+ ie8: false,
+ keep_fnames: false,
+ properties: false,
+ reserved: [],
+ toplevel: false,
+ }, true);
+ }
+ if (options.sourceMap) {
+ options.sourceMap = defaults(options.sourceMap, {
+ content: null,
+ filename: null,
+ includeSources: false,
+ root: null,
+ url: null,
+ }, true);
+ }
+ var warnings = [];
+ if (options.warnings && !AST_Node.warn_function) {
+ AST_Node.warn_function = function(warning) {
+ warnings.push(warning);
+ };
+ }
+ var toplevel;
+ if (files instanceof AST_Toplevel) {
+ toplevel = files;
+ } else {
+ options.parse = options.parse || {};
+ options.parse.toplevel = null;
+ for (var name in files) {
+ options.parse.filename = name;
+ options.parse.toplevel = parse(files[name], options.parse);
+ if (options.sourceMap && options.sourceMap.content == "inline") {
+ if (Object.keys(files).length > 1)
+ throw new Error("inline source map only works with singular input");
+ options.sourceMap.content = read_source_map(files[name]);
+ }
+ }
+ toplevel = options.parse.toplevel;
+ }
+ if (options.wrap) {
+ toplevel = toplevel.wrap_commonjs(options.wrap);
+ }
+ if (options.compress) {
+ toplevel.figure_out_scope(options.mangle);
+ toplevel = new Compressor(options.compress).compress(toplevel);
+ }
+ if (options.mangle) {
+ toplevel.figure_out_scope(options.mangle);
+ base54.reset();
+ toplevel.compute_char_frequency(options.mangle);
+ toplevel.mangle_names(options.mangle);
+ if (options.mangle.properties) {
+ toplevel = mangle_properties(toplevel, options.mangle.properties);
+ }
+ }
+ if (options.sourceMap) {
+ if (typeof options.sourceMap.content == "string") {
+ options.sourceMap.content = JSON.parse(options.sourceMap.content);
+ }
+ options.output.source_map = SourceMap({
+ file: options.sourceMap.filename,
+ orig: options.sourceMap.content,
+ root: options.sourceMap.root
+ });
+ if (options.sourceMap.includeSources) {
+ for (var name in files) {
+ options.output.source_map.get().setSourceContent(name, files[name]);
+ }
+ }
+ }
+ var stream = OutputStream(options.output);
+ toplevel.print(stream);
+ var result = {
+ code: stream.get()
+ };
+ if (options.sourceMap) {
+ result.map = options.output.source_map.toString();
+ if (options.sourceMap.url == "inline") {
+ result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map);
+ } else if (options.sourceMap.url) {
+ result.code += "\n//# sourceMappingURL=" + options.sourceMap.url;
+ }
+ }
+ if (warnings.length) {
+ result.warnings = warnings;
+ }
+ return result;
+ } finally {
+ AST_Node.warn_function = warn_function;
+ }
+}
diff --git a/lib/output.js b/lib/output.js
index fe982a7b..7a2e850f 100644
--- a/lib/output.js
+++ b/lib/output.js
@@ -57,6 +57,7 @@ function OutputStream(options) {
beautify : false,
bracketize : false,
comments : false,
+ ie8 : false,
indent_level : 4,
indent_start : 0,
inline_script : true,
@@ -66,7 +67,6 @@ function OutputStream(options) {
preserve_line : false,
quote_keys : false,
quote_style : 0,
- screw_ie8 : true,
semicolons : true,
shebang : true,
source_map : null,
@@ -136,7 +136,7 @@ function OutputStream(options) {
case "\t": return "\\t";
case "\b": return "\\b";
case "\f": return "\\f";
- case "\x0B": return options.screw_ie8 ? "\\v" : "\\x0B";
+ case "\x0B": return options.ie8 ? "\\x0B" : "\\v";
case "\u2028": return "\\u2028";
case "\u2029": return "\\u2029";
case "\ufeff": return "\\ufeff";
@@ -681,7 +681,7 @@ function OutputStream(options) {
}
});
- PARENS([ AST_Assign, AST_Conditional ], function (output){
+ PARENS([ AST_Assign, AST_Conditional ], function(output){
var p = output.parent();
// !(a = false) → true
if (p instanceof AST_Unary)
@@ -906,7 +906,7 @@ function OutputStream(options) {
function make_then(self, output) {
var b = self.body;
if (output.option("bracketize")
- || !output.option("screw_ie8") && b instanceof AST_Do)
+ || output.option("ie8") && b instanceof AST_Do)
return make_block(b, output);
// The squeezer replaces "block"-s that contain only a single
// statement with the statement itself; technically, the AST
@@ -1222,7 +1222,7 @@ function OutputStream(options) {
&& +key + "" == key)
&& parseFloat(key) >= 0) {
output.print(make_num(key));
- } else if (RESERVED_WORDS(key) ? output.option("screw_ie8") : is_identifier_string(key)) {
+ } else if (RESERVED_WORDS(key) ? !output.option("ie8") : is_identifier_string(key)) {
if (quote && output.option("keep_quoted_props")) {
output.print_string(key, quote);
} else {
diff --git a/lib/parse.js b/lib/parse.js
index c7d75802..27351b53 100644
--- a/lib/parse.js
+++ b/lib/parse.js
@@ -689,7 +689,6 @@ function parse($TEXT, options) {
options = defaults(options, {
bare_returns : false,
- cli : false,
expression : false,
filename : null,
html5_comments : true,
@@ -1502,7 +1501,6 @@ function parse($TEXT, options) {
};
function is_assignable(expr) {
- if (options.cli) return true;
return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef;
};
diff --git a/lib/propmangle.js b/lib/propmangle.js
index aaf5936f..efb31cc1 100644
--- a/lib/propmangle.js
+++ b/lib/propmangle.js
@@ -43,16 +43,16 @@
"use strict";
-function find_builtins() {
+function find_builtins(reserved) {
// NaN will be included due to Number.NaN
- var a = [
+ [
"null",
"true",
"false",
"Infinity",
"-Infinity",
"undefined",
- ];
+ ].forEach(add);
[ Object, Array, Function, Number,
String, Boolean, Error, Math,
Date, RegExp
@@ -63,24 +63,23 @@ function find_builtins() {
}
});
function add(name) {
- push_uniq(a, name);
+ push_uniq(reserved, name);
}
- return a;
}
function mangle_properties(ast, options) {
options = defaults(options, {
+ builtins: false,
cache: null,
debug: false,
- ignore_quoted: false,
+ keep_quoted: false,
only_cache: false,
regex: null,
reserved: null,
});
- var reserved = options.reserved;
- if (reserved == null)
- reserved = find_builtins();
+ var reserved = options.reserved || [];
+ if (!options.builtins) find_builtins(reserved);
var cache = options.cache;
if (cache == null) {
@@ -91,12 +90,12 @@ function mangle_properties(ast, options) {
}
var regex = options.regex;
- var ignore_quoted = options.ignore_quoted;
+ var keep_quoted = options.keep_quoted;
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
// the same as passing an empty string.
- var debug = (options.debug !== false);
+ var debug = options.debug !== false;
var debug_name_suffix;
if (debug) {
debug_name_suffix = (options.debug === true ? "" : options.debug);
@@ -104,12 +103,12 @@ function mangle_properties(ast, options) {
var names_to_mangle = [];
var unmangleable = [];
- var ignored = {};
+ var to_keep = {};
// step 1: find candidates to mangle
ast.walk(new TreeWalker(function(node){
if (node instanceof AST_ObjectKeyVal) {
- add(node.key, ignore_quoted && node.quote);
+ add(node.key, keep_quoted && node.quote);
}
else if (node instanceof AST_ObjectProperty) {
// setter or getter, since KeyVal is handled above
@@ -119,14 +118,14 @@ function mangle_properties(ast, options) {
add(node.property);
}
else if (node instanceof AST_Sub) {
- addStrings(node.property, ignore_quoted);
+ addStrings(node.property, keep_quoted);
}
}));
// step 2: transform the tree, renaming properties
return ast.transform(new TreeTransformer(function(node){
if (node instanceof AST_ObjectKeyVal) {
- if (!(ignore_quoted && node.quote))
+ if (!(keep_quoted && node.quote))
node.key = mangle(node.key);
}
else if (node instanceof AST_ObjectProperty) {
@@ -137,7 +136,7 @@ function mangle_properties(ast, options) {
node.property = mangle(node.property);
}
else if (node instanceof AST_Sub) {
- if (!ignore_quoted)
+ if (!keep_quoted)
node.property = mangleStrings(node.property);
}
// else if (node instanceof AST_String) {
@@ -167,16 +166,16 @@ function mangle_properties(ast, options) {
}
function should_mangle(name) {
- if (ignore_quoted && name in ignored) return false;
+ if (keep_quoted && name in to_keep) return false;
if (regex && !regex.test(name)) return false;
if (reserved.indexOf(name) >= 0) return false;
return cache.props.has(name)
|| names_to_mangle.indexOf(name) >= 0;
}
- function add(name, ignore) {
- if (ignore) {
- ignored[name] = true;
+ function add(name, keep) {
+ if (keep) {
+ to_keep[name] = true;
return;
}
@@ -199,19 +198,19 @@ function mangle_properties(ast, options) {
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_";
- if (can_mangle(debug_mangled) && !(ignore_quoted && debug_mangled in ignored)) {
+ if (can_mangle(debug_mangled) && !(keep_quoted && debug_mangled in to_keep)) {
mangled = debug_mangled;
}
}
// either debug mode is off, or it is on and we could not use the mangled name
if (!mangled) {
- // note can_mangle() does not check if the name collides with the 'ignored' set
- // (filled with quoted properties when ignore_quoted set). Make sure we add this
+ // Note: `can_mangle()` does not check if the name collides with the `to_keep` set
+ // (filled with quoted properties when `keep_quoted` is set). Make sure we add this
// check so we don't collide with a quoted name.
do {
mangled = base54(++cache.cname);
- } while (!can_mangle(mangled) || (ignore_quoted && mangled in ignored));
+ } while (!can_mangle(mangled) || keep_quoted && mangled in to_keep);
}
cache.props.set(name, mangled);
@@ -219,7 +218,7 @@ function mangle_properties(ast, options) {
return mangled;
}
- function addStrings(node, ignore) {
+ function addStrings(node, keep) {
var out = {};
try {
(function walk(node){
@@ -229,7 +228,7 @@ function mangle_properties(ast, options) {
return true;
}
if (node instanceof AST_String) {
- add(node.value, ignore);
+ add(node.value, keep);
return true;
}
if (node instanceof AST_Conditional) {
@@ -261,5 +260,4 @@ function mangle_properties(ast, options) {
return node;
}));
}
-
}
diff --git a/lib/scope.js b/lib/scope.js
index 74760e4f..2ffca25a 100644
--- a/lib/scope.js
+++ b/lib/scope.js
@@ -76,7 +76,7 @@ SymbolDef.prototype = {
else if (!this.mangled_name && !this.unmangleable(options)) {
var s = this.scope;
var sym = this.orig[0];
- if (!options.screw_ie8 && sym instanceof AST_SymbolLambda)
+ if (options.ie8 && sym instanceof AST_SymbolLambda)
s = s.parent_scope;
var def;
if (this.defun && (def = this.defun.variables.get(this.name))) {
@@ -93,7 +93,7 @@ SymbolDef.prototype = {
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
options = defaults(options, {
cache: null,
- screw_ie8: true,
+ ie8: false,
});
// pass 1: setup scope chaining and handle definitions
@@ -220,7 +220,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
self.walk(tw);
// pass 3: fix up any scoping issue with IE8
- if (!options.screw_ie8) {
+ if (options.ie8) {
self.walk(new TreeWalker(function(node, descend) {
if (node instanceof AST_SymbolCatch) {
var name = node.name;
@@ -325,8 +325,8 @@ AST_Scope.DEFMETHOD("next_mangled", function(options){
if (!is_identifier(m)) continue; // skip over "do"
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
- // shadow a name excepted from mangling.
- if (options.except.indexOf(m) >= 0) continue;
+ // shadow a name reserved from mangling.
+ if (options.reserved.indexOf(m) >= 0) continue;
// we must ensure that the mangled name does not shadow a name
// from some parent scope that is referenced in this or in
@@ -399,10 +399,9 @@ AST_Symbol.DEFMETHOD("global", function(){
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
return defaults(options, {
eval : false,
- except : [],
+ ie8 : false,
keep_fnames : false,
- screw_ie8 : true,
- sort : false, // Ignored. Flag retained for backwards compatibility.
+ reserved : [],
toplevel : false,
});
});
@@ -411,7 +410,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
options = this._default_mangler_options(options);
// Never mangle arguments
- options.except.push('arguments');
+ options.reserved.push('arguments');
// We only need to mangle declaration nodes. Special logic wired
// into the code generator will display the mangled name if it's
@@ -422,7 +421,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
if (options.cache) {
this.globals.each(function(symbol){
- if (options.except.indexOf(symbol.name) < 0) {
+ if (options.reserved.indexOf(symbol.name) < 0) {
to_mangle.push(symbol);
}
});
@@ -439,7 +438,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
if (node instanceof AST_Scope) {
var p = tw.parent(), a = [];
node.variables.each(function(symbol){
- if (options.except.indexOf(symbol.name) < 0) {
+ if (options.reserved.indexOf(symbol.name) < 0) {
a.push(symbol);
}
});
@@ -452,7 +451,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
node.mangled_name = name;
return true;
}
- if (options.screw_ie8 && node instanceof AST_SymbolCatch) {
+ if (!options.ie8 && node instanceof AST_SymbolCatch) {
to_mangle.push(node.definition());
return;
}
@@ -573,89 +572,3 @@ var base54 = (function() {
};
return base54;
})();
-
-AST_Toplevel.DEFMETHOD("scope_warnings", function(options){
- options = defaults(options, {
- assign_to_global : true,
- eval : true,
- func_arguments : true,
- nested_defuns : true,
- undeclared : false, // this makes a lot of noise
- unreferenced : true,
- });
- var tw = new TreeWalker(function(node){
- if (options.undeclared
- && node instanceof AST_SymbolRef
- && node.undeclared())
- {
- // 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} [{file}:{line},{col}]", {
- name: node.name,
- file: node.start.file,
- line: node.start.line,
- col: node.start.col
- });
- }
- if (options.assign_to_global)
- {
- var sym = null;
- if (node instanceof AST_Assign && node.left instanceof AST_SymbolRef)
- sym = node.left;
- else if (node instanceof AST_ForIn && node.init instanceof AST_SymbolRef)
- sym = node.init;
- if (sym
- && (sym.undeclared()
- || (sym.global() && sym.scope !== sym.definition().scope))) {
- 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
- });
- }
- }
- if (options.eval
- && node instanceof AST_SymbolRef
- && node.undeclared()
- && node.name == "eval") {
- AST_Node.warn("Eval is used [{file}:{line},{col}]", node.start);
- }
- if (options.unreferenced
- && (node instanceof AST_SymbolDeclaration || node instanceof AST_Label)
- && !(node instanceof AST_SymbolCatch)
- && node.unreferenced()) {
- 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
- });
- }
- if (options.func_arguments
- && node instanceof AST_Lambda
- && node.uses_arguments) {
- 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
- });
- }
- if (options.nested_defuns
- && node instanceof AST_Defun
- && !(tw.parent() instanceof AST_Scope)) {
- 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
- });
- }
- });
- this.walk(tw);
-});