aboutsummaryrefslogtreecommitdiff
path: root/node_modules/uglify-js/lib/ast.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/uglify-js/lib/ast.js')
-rw-r--r--node_modules/uglify-js/lib/ast.js160
1 files changed, 21 insertions, 139 deletions
diff --git a/node_modules/uglify-js/lib/ast.js b/node_modules/uglify-js/lib/ast.js
index 028772f3f..0918574d1 100644
--- a/node_modules/uglify-js/lib/ast.js
+++ b/node_modules/uglify-js/lib/ast.js
@@ -182,21 +182,13 @@ var AST_BlockStatement = DEFNODE("BlockStatement", null, {
}, AST_Block);
var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
- $documentation: "The empty statement (empty block or simply a semicolon)",
- _walk: function(visitor) {
- return visitor._visit(this);
- }
+ $documentation: "The empty statement (empty block or simply a semicolon)"
}, AST_Statement);
var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
$documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
$propdoc: {
body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function(){
- this.body._walk(visitor);
- });
}
}, AST_Statement);
@@ -326,62 +318,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;
@@ -552,10 +495,10 @@ var AST_Finally = DEFNODE("Finally", null, {
$documentation: "A `finally` node; only makes sense as part of a `try` statement"
}, AST_Block);
-/* -----[ VAR/CONST ]----- */
+/* -----[ VAR ]----- */
var AST_Definitions = DEFNODE("Definitions", "definitions", {
- $documentation: "Base class for `var` or `const` nodes (variable declarations/initializations)",
+ $documentation: "Base class for `var` nodes (variable declarations/initializations)",
$propdoc: {
definitions: "[AST_VarDef*] array of variable definitions"
},
@@ -573,14 +516,10 @@ var AST_Var = DEFNODE("Var", null, {
$documentation: "A `var` statement"
}, AST_Definitions);
-var AST_Const = DEFNODE("Const", null, {
- $documentation: "A `const` statement"
-}, AST_Definitions);
-
var AST_VarDef = DEFNODE("VarDef", "name value", {
$documentation: "A variable declaration; only appears in a AST_Definitions node",
$propdoc: {
- name: "[AST_SymbolVar|AST_SymbolConst] name of the variable",
+ name: "[AST_SymbolVar] name of the variable",
value: "[AST_Node?] initializer, or null of there's no initializer"
},
_walk: function(visitor) {
@@ -601,11 +540,11 @@ var AST_Call = DEFNODE("Call", "expression args", {
},
_walk: function(visitor) {
return visitor._visit(this, function(){
- this.expression._walk(visitor);
var args = this.args;
for (var i = 0, len = args.length; i < len; i++) {
args[i]._walk(visitor);
}
+ this.expression._walk(visitor);
});
}
});
@@ -614,68 +553,16 @@ var AST_New = DEFNODE("New", null, {
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
}, AST_Call);
-var AST_Seq = DEFNODE("Seq", "car cdr", {
- $documentation: "A sequence expression (two comma-separated expressions)",
+var AST_Sequence = DEFNODE("Sequence", "expressions", {
+ $documentation: "A sequence expression (comma-separated expressions)",
$propdoc: {
- car: "[AST_Node] first element in sequence",
- cdr: "[AST_Node] second element in sequence"
- },
- $cons: function(x, y) {
- var seq = new AST_Seq(x);
- seq.car = x;
- seq.cdr = y;
- return seq;
- },
- $from_array: function(array) {
- if (array.length == 0) return null;
- if (array.length == 1) return array[0].clone();
- var list = null;
- for (var i = array.length; --i >= 0;) {
- list = AST_Seq.cons(array[i], list);
- }
- var p = list;
- while (p) {
- if (p.cdr && !p.cdr.cdr) {
- p.cdr = p.cdr.car;
- break;
- }
- p = p.cdr;
- }
- return list;
- },
- to_array: function() {
- var p = this, a = [];
- while (p) {
- a.push(p.car);
- if (p.cdr && !(p.cdr instanceof AST_Seq)) {
- a.push(p.cdr);
- break;
- }
- p = p.cdr;
- }
- return a;
- },
- add: function(node) {
- var p = this;
- while (p) {
- if (!(p.cdr instanceof AST_Seq)) {
- var cell = AST_Seq.cons(p.cdr, node);
- return p.cdr = cell;
- }
- p = p.cdr;
- }
- },
- len: function() {
- if (this.cdr instanceof AST_Seq) {
- return this.cdr.len() + 1;
- } else {
- return 2;
- }
+ expressions: "[AST_Node*] array of expressions (at least two)"
},
_walk: function(visitor) {
return visitor._visit(this, function(){
- this.car._walk(visitor);
- if (this.cdr) this.cdr._walk(visitor);
+ this.expressions.forEach(function(node) {
+ node._walk(visitor);
+ });
});
}
});
@@ -728,7 +615,7 @@ var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, {
$documentation: "Unary postfix expression, i.e. `i++`"
}, AST_Unary);
-var AST_Binary = DEFNODE("Binary", "left operator right", {
+var AST_Binary = DEFNODE("Binary", "operator left right", {
$documentation: "Binary expression, i.e. `a + b`",
$propdoc: {
left: "[AST_Node] left-hand side expression",
@@ -837,17 +724,13 @@ var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
}, AST_Symbol);
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
- $documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",
+ $documentation: "A declaration symbol (symbol in var, function name or argument, symbol in catch)",
}, AST_Symbol);
var AST_SymbolVar = DEFNODE("SymbolVar", null, {
$documentation: "Symbol defining a variable",
}, AST_SymbolDeclaration);
-var AST_SymbolConst = DEFNODE("SymbolConst", null, {
- $documentation: "A constant declaration"
-}, AST_SymbolDeclaration);
-
var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
$documentation: "Symbol naming a function argument",
}, AST_SymbolVar);
@@ -976,13 +859,13 @@ TreeWalker.prototype = {
if (!ret && descend) {
descend.call(node);
}
- this.pop(node);
+ this.pop();
return ret;
},
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]) {
@@ -990,9 +873,8 @@ TreeWalker.prototype = {
}
this.stack.push(node);
},
- pop: function(node) {
- this.stack.pop();
- if (node instanceof AST_Lambda) {
+ pop: function() {
+ if (this.stack.pop() instanceof AST_Lambda) {
this.directives = Object.getPrototypeOf(this.directives);
}
},