aboutsummaryrefslogtreecommitdiff
path: root/node_modules/uglify-js/lib/ast.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2018-09-20 02:56:13 +0200
committerFlorian Dold <florian.dold@gmail.com>2018-09-20 02:56:13 +0200
commitbbff7403fbf46f9ad92240ac213df8d30ef31b64 (patch)
treec58400ec5124da1c7d56b01aea83309f80a56c3b /node_modules/uglify-js/lib/ast.js
parent003fb34971cf63466184351b4db5f7c67df4f444 (diff)
update packages
Diffstat (limited to 'node_modules/uglify-js/lib/ast.js')
-rw-r--r--node_modules/uglify-js/lib/ast.js211
1 files changed, 124 insertions, 87 deletions
diff --git a/node_modules/uglify-js/lib/ast.js b/node_modules/uglify-js/lib/ast.js
index 997486c29..09c29b416 100644
--- a/node_modules/uglify-js/lib/ast.js
+++ b/node_modules/uglify-js/lib/ast.js
@@ -44,21 +44,21 @@
"use strict";
function DEFNODE(type, props, methods, base) {
- if (arguments.length < 4) base = AST_Node;
- if (!props) props = [];
- else props = props.split(/\s+/);
+ if (typeof base === "undefined") base = AST_Node;
+ props = props ? props.split(/\s+/) : [];
var self_props = props;
- if (base && base.PROPS)
- props = props.concat(base.PROPS);
- var code = "return function AST_" + type + "(props){ if (props) { ";
- for (var i = props.length; --i >= 0;) {
- code += "this." + props[i] + " = props." + props[i] + ";";
- }
+ if (base && base.PROPS) props = props.concat(base.PROPS);
+ var code = [
+ "return function AST_", type, "(props){",
+ "if(props){",
+ ];
+ props.forEach(function(prop) {
+ code.push("this.", prop, "=props.", prop, ";");
+ });
var proto = base && new base;
- if (proto && proto.initialize || (methods && methods.initialize))
- code += "this.initialize();";
- code += "}}";
- var ctor = new Function(code)();
+ if (proto && proto.initialize || methods && methods.initialize) code.push("this.initialize();");
+ code.push("}}");
+ var ctor = new Function(code.join(""))();
if (proto) {
ctor.prototype = proto;
ctor.BASE = base;
@@ -71,11 +71,11 @@ function DEFNODE(type, props, methods, base) {
if (type) {
ctor.prototype.TYPE = ctor.TYPE = type;
}
- if (methods) for (i in methods) if (HOP(methods, i)) {
- if (/^\$/.test(i)) {
- ctor[i.substr(1)] = methods[i];
+ if (methods) for (var name in methods) if (HOP(methods, name)) {
+ if (/^\$/.test(name)) {
+ ctor[name.substr(1)] = methods[name];
} else {
- ctor.prototype[i] = methods[i];
+ ctor.prototype[name] = methods[name];
}
}
ctor.DEFMETHOD = function(name, method) {
@@ -85,9 +85,9 @@ function DEFNODE(type, props, methods, base) {
exports["AST_" + type] = ctor;
}
return ctor;
-};
+}
-var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before file raw", {
+var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", {
}, null);
var AST_Node = DEFNODE("Node", "start end", {
@@ -118,10 +118,8 @@ var AST_Node = DEFNODE("Node", "start end", {
}
}, null);
-AST_Node.warn_function = null;
AST_Node.warn = function(txt, props) {
- if (AST_Node.warn_function)
- AST_Node.warn_function(string_template(txt, props));
+ if (AST_Node.warn_function) AST_Node.warn_function(string_template(txt, props));
};
/* -----[ statements ]----- */
@@ -148,7 +146,7 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
body: "[AST_Node] an expression node (should not be instanceof AST_Statement)"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.body._walk(visitor);
});
}
@@ -158,19 +156,18 @@ function walk_body(node, visitor) {
var body = node.body;
if (body instanceof AST_Statement) {
body._walk(visitor);
- }
- else for (var i = 0, len = body.length; i < len; i++) {
- body[i]._walk(visitor);
- }
-};
+ } else body.forEach(function(node) {
+ node._walk(visitor);
+ });
+}
var AST_Block = DEFNODE("Block", "body", {
- $documentation: "A body of statements (usually bracketed)",
+ $documentation: "A body of statements (usually braced)",
$propdoc: {
body: "[AST_Statement*] an array of statements"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
walk_body(this, visitor);
});
}
@@ -197,7 +194,7 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
label: "[AST_Label] a label definition"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.label._walk(visitor);
this.body._walk(visitor);
});
@@ -208,8 +205,7 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
var label = node.label;
var def = this.label;
node.walk(new TreeWalker(function(node) {
- if (node instanceof AST_LoopControl
- && node.label && node.label.thedef === def) {
+ if (node instanceof AST_LoopControl && node.label && node.label.thedef === def) {
node.label.thedef = label;
label.references.push(node);
}
@@ -233,7 +229,7 @@ var AST_DWLoop = DEFNODE("DWLoop", "condition", {
var AST_Do = DEFNODE("Do", null, {
$documentation: "A `do` statement",
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.body._walk(visitor);
this.condition._walk(visitor);
});
@@ -243,7 +239,7 @@ var AST_Do = DEFNODE("Do", null, {
var AST_While = DEFNODE("While", null, {
$documentation: "A `while` statement",
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.condition._walk(visitor);
this.body._walk(visitor);
});
@@ -258,7 +254,7 @@ var AST_For = DEFNODE("For", "init condition step", {
step: "[AST_Node?] the `for` update clause, or null if empty"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
if (this.init) this.init._walk(visitor);
if (this.condition) this.condition._walk(visitor);
if (this.step) this.step._walk(visitor);
@@ -267,15 +263,14 @@ var AST_For = DEFNODE("For", "init condition step", {
}
}, AST_IterationStatement);
-var AST_ForIn = DEFNODE("ForIn", "init name object", {
+var AST_ForIn = DEFNODE("ForIn", "init object", {
$documentation: "A `for ... in` statement",
$propdoc: {
init: "[AST_Node] the `for/in` initialization code",
- name: "[AST_SymbolRef?] the loop variable, only if `init` is AST_Var",
object: "[AST_Node] the object that we're looping through"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.init._walk(visitor);
this.object._walk(visitor);
this.body._walk(visitor);
@@ -289,7 +284,7 @@ var AST_With = DEFNODE("With", "expression", {
expression: "[AST_Node] the `with` expression"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.expression._walk(visitor);
this.body._walk(visitor);
});
@@ -309,6 +304,16 @@ var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
},
+ clone: function(deep) {
+ var node = this._clone(deep);
+ if (this.variables) node.variables = this.variables.clone();
+ if (this.functions) node.functions = this.functions.clone();
+ if (this.enclosed) node.enclosed = this.enclosed.slice();
+ return node;
+ },
+ pinned: function() {
+ return this.uses_eval || this.uses_with;
+ }
}, AST_Block);
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
@@ -320,12 +325,29 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
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){
+ wrapped_tl = wrapped_tl.transform(new TreeTransformer(function(node) {
if (node instanceof AST_Directive && node.value == "$ORIG") {
return MAP.splice(body);
}
}));
return wrapped_tl;
+ },
+ wrap_enclose: function(args_values) {
+ if (typeof args_values != "string") args_values = "";
+ var index = args_values.indexOf(":");
+ if (index < 0) index = args_values.length;
+ var body = this.body;
+ return parse([
+ "(function(",
+ args_values.slice(0, index),
+ '){"$ORIG"})(',
+ args_values.slice(index + 1),
+ ")"
+ ].join("")).transform(new TreeTransformer(function(node) {
+ if (node instanceof AST_Directive && node.value == "$ORIG") {
+ return MAP.splice(body);
+ }
+ }));
}
}, AST_Scope);
@@ -337,12 +359,11 @@ var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", {
uses_arguments: "[boolean/S] tells whether this function accesses the arguments array"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
if (this.name) this.name._walk(visitor);
- var argnames = this.argnames;
- for (var i = 0, len = argnames.length; i < len; i++) {
- argnames[i]._walk(visitor);
- }
+ this.argnames.forEach(function(argname) {
+ argname._walk(visitor);
+ });
walk_body(this, visitor);
});
}
@@ -372,7 +393,7 @@ var AST_Exit = DEFNODE("Exit", "value", {
value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return"
},
_walk: function(visitor) {
- return visitor._visit(this, this.value && function(){
+ return visitor._visit(this, this.value && function() {
this.value._walk(visitor);
});
}
@@ -392,7 +413,7 @@ var AST_LoopControl = DEFNODE("LoopControl", "label", {
label: "[AST_LabelRef?] the label, or null if none",
},
_walk: function(visitor) {
- return visitor._visit(this, this.label && function(){
+ return visitor._visit(this, this.label && function() {
this.label._walk(visitor);
});
}
@@ -415,7 +436,7 @@ var AST_If = DEFNODE("If", "condition alternative", {
alternative: "[AST_Statement?] the `else` part, or null if not present"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.condition._walk(visitor);
this.body._walk(visitor);
if (this.alternative) this.alternative._walk(visitor);
@@ -431,7 +452,7 @@ var AST_Switch = DEFNODE("Switch", "expression", {
expression: "[AST_Node] the `switch` “discriminant”"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.expression._walk(visitor);
walk_body(this, visitor);
});
@@ -452,7 +473,7 @@ var AST_Case = DEFNODE("Case", "expression", {
expression: "[AST_Node] the `case` expression"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.expression._walk(visitor);
walk_body(this, visitor);
});
@@ -468,7 +489,7 @@ var AST_Try = DEFNODE("Try", "bcatch bfinally", {
bfinally: "[AST_Finally?] the finally block, or null if not present"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
walk_body(this, visitor);
if (this.bcatch) this.bcatch._walk(visitor);
if (this.bfinally) this.bfinally._walk(visitor);
@@ -482,7 +503,7 @@ var AST_Catch = DEFNODE("Catch", "argname", {
argname: "[AST_SymbolCatch] symbol for the exception"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.argname._walk(visitor);
walk_body(this, visitor);
});
@@ -501,11 +522,10 @@ var AST_Definitions = DEFNODE("Definitions", "definitions", {
definitions: "[AST_VarDef*] array of variable definitions"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
- var definitions = this.definitions;
- for (var i = 0, len = definitions.length; i < len; i++) {
- definitions[i]._walk(visitor);
- }
+ return visitor._visit(this, function() {
+ this.definitions.forEach(function(defn) {
+ defn._walk(visitor);
+ });
});
}
}, AST_Statement);
@@ -521,7 +541,7 @@ var AST_VarDef = DEFNODE("VarDef", "name value", {
value: "[AST_Node?] initializer, or null of there's no initializer"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.name._walk(visitor);
if (this.value) this.value._walk(visitor);
});
@@ -537,12 +557,11 @@ var AST_Call = DEFNODE("Call", "expression args", {
args: "[AST_Node*] array of arguments"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
- var args = this.args;
- for (var i = 0, len = args.length; i < len; i++) {
- args[i]._walk(visitor);
- }
+ return visitor._visit(this, function() {
this.expression._walk(visitor);
+ this.args.forEach(function(node) {
+ node._walk(visitor);
+ });
});
}
});
@@ -557,7 +576,7 @@ var AST_Sequence = DEFNODE("Sequence", "expressions", {
expressions: "[AST_Node*] array of expressions (at least two)"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.expressions.forEach(function(node) {
node._walk(visitor);
});
@@ -576,7 +595,7 @@ var AST_PropAccess = DEFNODE("PropAccess", "expression property", {
var AST_Dot = DEFNODE("Dot", null, {
$documentation: "A dotted property access expression",
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.expression._walk(visitor);
});
}
@@ -585,7 +604,7 @@ var AST_Dot = DEFNODE("Dot", null, {
var AST_Sub = DEFNODE("Sub", null, {
$documentation: "Index-style property access, i.e. `a[\"foo\"]`",
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.expression._walk(visitor);
this.property._walk(visitor);
});
@@ -599,7 +618,7 @@ var AST_Unary = DEFNODE("Unary", "operator expression", {
expression: "[AST_Node] expression that this unary operator applies to"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.expression._walk(visitor);
});
}
@@ -621,7 +640,7 @@ var AST_Binary = DEFNODE("Binary", "operator left right", {
right: "[AST_Node] right-hand side expression"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.left._walk(visitor);
this.right._walk(visitor);
});
@@ -636,7 +655,7 @@ var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative",
alternative: "[AST_Node]"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.condition._walk(visitor);
this.consequent._walk(visitor);
this.alternative._walk(visitor);
@@ -656,11 +675,10 @@ var AST_Array = DEFNODE("Array", "elements", {
elements: "[AST_Node*] array of elements"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
- var elements = this.elements;
- for (var i = 0, len = elements.length; i < len; i++) {
- elements[i]._walk(visitor);
- }
+ return visitor._visit(this, function() {
+ this.elements.forEach(function(element) {
+ element._walk(visitor);
+ });
});
}
});
@@ -671,11 +689,10 @@ var AST_Object = DEFNODE("Object", "properties", {
properties: "[AST_ObjectProperty*] array of properties"
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
- var properties = this.properties;
- for (var i = 0, len = properties.length; i < len; i++) {
- properties[i]._walk(visitor);
- }
+ return visitor._visit(this, function() {
+ this.properties.forEach(function(prop) {
+ prop._walk(visitor);
+ });
});
}
});
@@ -683,11 +700,11 @@ var AST_Object = DEFNODE("Object", "properties", {
var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
$documentation: "Base class for literal object properties",
$propdoc: {
- key: "[string] the property name converted to a string for ObjectKeyVal. For setters and getters this is an AST_SymbolAccessor.",
- value: "[AST_Node] property value. For setters and getters this is an AST_Accessor."
+ key: "[string|AST_SymbolAccessor] property name. For ObjectKeyVal this is a string. For getters and setters this is an AST_SymbolAccessor.",
+ value: "[AST_Node] property value. For getters and setters this is an AST_Accessor."
},
_walk: function(visitor) {
- return visitor._visit(this, function(){
+ return visitor._visit(this, function() {
this.value._walk(visitor);
});
}
@@ -814,12 +831,12 @@ var AST_NaN = DEFNODE("NaN", null, {
var AST_Undefined = DEFNODE("Undefined", null, {
$documentation: "The `undefined` value",
- value: (function(){}())
+ value: function(){}()
}, AST_Atom);
var AST_Hole = DEFNODE("Hole", null, {
$documentation: "A hole in an array",
- value: (function(){}())
+ value: function(){}()
}, AST_Atom);
var AST_Infinity = DEFNODE("Infinity", null, {
@@ -847,11 +864,11 @@ function TreeWalker(callback) {
this.visit = callback;
this.stack = [];
this.directives = Object.create(null);
-};
+}
TreeWalker.prototype = {
_visit: function(node, descend) {
this.push(node);
- var ret = this.visit(node, descend ? function(){
+ var ret = this.visit(node, descend ? function() {
descend.call(node);
} : noop);
if (!ret && descend) {
@@ -910,5 +927,25 @@ TreeWalker.prototype = {
|| node instanceof AST_Break && x instanceof AST_Switch)
return x;
}
+ },
+ in_boolean_context: function() {
+ var self = this.self();
+ for (var i = 0, p; p = this.parent(i); i++) {
+ if (p instanceof AST_SimpleStatement
+ || p instanceof AST_Conditional && p.condition === self
+ || p instanceof AST_DWLoop && p.condition === self
+ || p instanceof AST_For && p.condition === self
+ || p instanceof AST_If && p.condition === self
+ || p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) {
+ return true;
+ }
+ if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")
+ || p instanceof AST_Conditional
+ || p.tail_node() === self) {
+ self = p;
+ } else {
+ return false;
+ }
+ }
}
};