support defines
This commit is contained in:
@@ -22,6 +22,7 @@ For example -p 3 will drop 3 directories from file names and ensure they are rel
|
|||||||
.describe("c", "Enable compressor/pass compressor options. \
|
.describe("c", "Enable compressor/pass compressor options. \
|
||||||
Pass options like -c hoist_vars=false,if_return=false. \
|
Pass options like -c hoist_vars=false,if_return=false. \
|
||||||
Use -c with no argument if you want to disable the squeezer entirely.")
|
Use -c with no argument if you want to disable the squeezer entirely.")
|
||||||
|
.describe("d", "Global definitions")
|
||||||
|
|
||||||
.describe("stats", "Display operations run time on STDERR.")
|
.describe("stats", "Display operations run time on STDERR.")
|
||||||
.describe("v", "Verbose")
|
.describe("v", "Verbose")
|
||||||
@@ -32,10 +33,12 @@ Use -c with no argument if you want to disable the squeezer entirely.")
|
|||||||
.alias("b", "beautify")
|
.alias("b", "beautify")
|
||||||
.alias("m", "mangle")
|
.alias("m", "mangle")
|
||||||
.alias("c", "compress")
|
.alias("c", "compress")
|
||||||
|
.alias("d", "define")
|
||||||
|
|
||||||
.string("b")
|
.string("b")
|
||||||
.string("m")
|
.string("m")
|
||||||
.string("c")
|
.string("c")
|
||||||
|
.string("d")
|
||||||
.boolean("v")
|
.boolean("v")
|
||||||
.boolean("stats")
|
.boolean("stats")
|
||||||
|
|
||||||
@@ -67,7 +70,7 @@ function getOptions(x) {
|
|||||||
var a = opt.split(/\s*[=:]\s*/);
|
var a = opt.split(/\s*[=:]\s*/);
|
||||||
ret[a[0]] = a.length > 1 ? new Function("return(" + a[1] + ")")() : true;
|
ret[a[0]] = a.length > 1 ? new Function("return(" + a[1] + ")")() : true;
|
||||||
});
|
});
|
||||||
normalize(ret)
|
normalize(ret);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -76,6 +79,10 @@ var COMPRESS = getOptions("c");
|
|||||||
var MANGLE = getOptions("m");
|
var MANGLE = getOptions("m");
|
||||||
var BEAUTIFY = getOptions("b");
|
var BEAUTIFY = getOptions("b");
|
||||||
|
|
||||||
|
if (COMPRESS && ARGS.d) {
|
||||||
|
COMPRESS.global_defs = getOptions("d");
|
||||||
|
}
|
||||||
|
|
||||||
var OUTPUT_OPTIONS = {
|
var OUTPUT_OPTIONS = {
|
||||||
beautify: BEAUTIFY ? true : false
|
beautify: BEAUTIFY ? true : false
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -65,7 +65,8 @@ function Compressor(options, false_by_default) {
|
|||||||
join_vars : !false_by_default,
|
join_vars : !false_by_default,
|
||||||
cascade : !false_by_default,
|
cascade : !false_by_default,
|
||||||
|
|
||||||
warnings : true
|
warnings : true,
|
||||||
|
global_defs : {}
|
||||||
}, true);
|
}, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -132,6 +133,30 @@ merge(Compressor.prototype, {
|
|||||||
return new ctor(props);
|
return new ctor(props);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function make_node_from_constant(compressor, val, orig) {
|
||||||
|
switch (typeof val) {
|
||||||
|
case "string":
|
||||||
|
return make_node(AST_String, orig, {
|
||||||
|
value: val
|
||||||
|
}).optimize(compressor);
|
||||||
|
case "number":
|
||||||
|
return make_node(isNaN(val) ? AST_NaN : AST_Number, orig, {
|
||||||
|
value: val
|
||||||
|
}).optimize(compressor);
|
||||||
|
case "boolean":
|
||||||
|
return make_node(val ? AST_True : AST_False, orig);
|
||||||
|
case "undefined":
|
||||||
|
return make_node(AST_Undefined, orig).optimize(compressor);
|
||||||
|
default:
|
||||||
|
if (val === null) {
|
||||||
|
return make_node(AST_Null, orig).optimize(compressor);
|
||||||
|
}
|
||||||
|
throw new Error(string_template("Can't handle constant of type: {type}", {
|
||||||
|
type: typeof val
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
function as_statement_array(thing) {
|
function as_statement_array(thing) {
|
||||||
if (thing === null) return [];
|
if (thing === null) return [];
|
||||||
if (thing instanceof AST_BlockStatement) return thing.body;
|
if (thing instanceof AST_BlockStatement) return thing.body;
|
||||||
@@ -493,33 +518,7 @@ merge(Compressor.prototype, {
|
|||||||
AST_Node.DEFMETHOD("evaluate", function(compressor){
|
AST_Node.DEFMETHOD("evaluate", function(compressor){
|
||||||
if (!compressor.option("evaluate")) return [ this ];
|
if (!compressor.option("evaluate")) return [ this ];
|
||||||
try {
|
try {
|
||||||
var val = this._eval(), ast;
|
var val = this._eval(), ast = make_node_from_constant(compressor, val, this);
|
||||||
switch (typeof val) {
|
|
||||||
case "string":
|
|
||||||
ast = make_node(AST_String, this, {
|
|
||||||
value: val
|
|
||||||
}).optimize(compressor);
|
|
||||||
break;
|
|
||||||
case "number":
|
|
||||||
ast = make_node(isNaN(val) ? AST_NaN : AST_Number, this, {
|
|
||||||
value: val
|
|
||||||
}).optimize(compressor);
|
|
||||||
break;
|
|
||||||
case "boolean":
|
|
||||||
ast = make_node(val ? AST_True : AST_False, this);
|
|
||||||
break;
|
|
||||||
case "undefined":
|
|
||||||
ast = make_node(AST_Undefined, this).optimize(compressor);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (val === null) {
|
|
||||||
ast = make_node(AST_Null, this).optimize(compressor);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
throw new Error(string_template("Can't handle constant of type: {type}", {
|
|
||||||
type: typeof val
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
return [ best_of(ast, this), val ];
|
return [ best_of(ast, this), val ];
|
||||||
} catch(ex) {
|
} catch(ex) {
|
||||||
if (ex !== def) throw ex;
|
if (ex !== def) throw ex;
|
||||||
@@ -1439,12 +1438,18 @@ merge(Compressor.prototype, {
|
|||||||
});
|
});
|
||||||
|
|
||||||
OPT(AST_SymbolRef, function(self, compressor){
|
OPT(AST_SymbolRef, function(self, compressor){
|
||||||
if (self.undeclared()) switch (self.name) {
|
if (self.undeclared()) {
|
||||||
|
var defines = compressor.option("global_defs");
|
||||||
|
if (defines && HOP(defines, self.name)) {
|
||||||
|
return make_node_from_constant(compressor, defines[self.name], self);
|
||||||
|
}
|
||||||
|
switch (self.name) {
|
||||||
case "undefined":
|
case "undefined":
|
||||||
return make_node(AST_Undefined, self);
|
return make_node(AST_Undefined, self);
|
||||||
case "NaN":
|
case "NaN":
|
||||||
return make_node(AST_NaN, self);
|
return make_node(AST_NaN, self);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return self;
|
return self;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -331,6 +331,14 @@ AST_Symbol.DEFMETHOD("undeclared", function(){
|
|||||||
return this.definition().undeclared;
|
return this.definition().undeclared;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
AST_LabelRef.DEFMETHOD("undeclared", function(){
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Label.DEFMETHOD("undeclared", function(){
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("definition", function(){
|
AST_Symbol.DEFMETHOD("definition", function(){
|
||||||
return this.thedef;
|
return this.thedef;
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user