From e1862cd36f147e410c003c9daee5fd2befdf9a42 Mon Sep 17 00:00:00 2001 From: Mihai Bazon Date: Tue, 9 Oct 2012 13:21:21 +0300 Subject: [PATCH] add `--ast-help` displays a rather cruel description of the AST classes, derived directly from the node definitions. --- bin/uglifyjs2 | 10 ++++++++-- lib/ast.js | 8 ++------ tools/node.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/bin/uglifyjs2 b/bin/uglifyjs2 index b3b00a7b..8515586a 100755 --- a/bin/uglifyjs2 +++ b/bin/uglifyjs2 @@ -78,6 +78,14 @@ You need to pass an argument to this option to specify the name that your module .argv ; +normalize(ARGS); + +if (ARGS.ast_help) { + var desc = UglifyJS.describe_ast(); + sys.puts(typeof desc == "string" ? desc : JSON.stringify(desc, null, 2)); + process.exit(0); +} + if (ARGS.h || ARGS.help) { sys.puts(optimist.help()); process.exit(0); @@ -87,8 +95,6 @@ if (ARGS.acorn) { acorn = require("acorn"); } -normalize(ARGS); - var COMPRESS = getOptions("c"); var MANGLE = getOptions("m"); var BEAUTIFY = getOptions("b"); diff --git a/lib/ast.js b/lib/ast.js index f44fa3ae..fde1ca1a 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -43,8 +43,6 @@ "use strict"; -var NODE_HIERARCHY = {}; - function DEFNODE(type, props, methods, base) { if (arguments.length < 4) base = AST_Node; if (!props) props = []; @@ -67,9 +65,11 @@ function DEFNODE(type, props, methods, base) { ctor.prototype = proto; ctor.BASE = base; } + if (base) base.SUBCLASSES.push(ctor); ctor.prototype.CTOR = ctor; ctor.PROPS = props || null; ctor.SELF_PROPS = self_props; + ctor.SUBCLASSES = []; if (type) { ctor.prototype.TYPE = ctor.TYPE = type; } @@ -83,10 +83,6 @@ function DEFNODE(type, props, methods, base) { ctor.DEFMETHOD = function(name, method) { this.prototype[name] = method; }; - NODE_HIERARCHY[type] = { - def: ctor, - base: base - }; return ctor; }; diff --git a/tools/node.js b/tools/node.js index fccdd83f..a35dcd2f 100644 --- a/tools/node.js +++ b/tools/node.js @@ -107,3 +107,52 @@ exports.minify = function(files, options) { map : map + "" }; }; + +// exports.describe_ast = function() { +// function doitem(ctor) { +// var sub = {}; +// ctor.SUBCLASSES.forEach(function(ctor){ +// sub[ctor.TYPE] = doitem(ctor); +// }); +// var ret = {}; +// if (ctor.SELF_PROPS.length > 0) ret.props = ctor.SELF_PROPS; +// if (ctor.SUBCLASSES.length > 0) ret.sub = sub; +// return ret; +// } +// return doitem(UglifyJS.AST_Node).sub; +// } + +exports.describe_ast = function() { + var out = UglifyJS.OutputStream({ beautify: true }); + function doitem(ctor) { + out.print("AST_" + ctor.TYPE); + var props = ctor.SELF_PROPS.filter(function(prop){ + return !/^\$/.test(prop); + }); + if (props.length > 0) { + out.space(); + out.with_parens(function(){ + props.forEach(function(prop, i){ + if (i) out.space(); + out.print(prop); + }); + }); + } + if (ctor.documentation) { + out.space(); + out.print_string(ctor.documentation); + } + if (ctor.SUBCLASSES.length > 0) { + out.space(); + out.with_block(function(){ + ctor.SUBCLASSES.forEach(function(ctor, i){ + out.indent(); + doitem(ctor); + out.newline(); + }); + }); + } + }; + doitem(UglifyJS.AST_Node); + return out + ""; +}; -- 2.34.1