サブスタックのburritoを使用して、このようなものを構築できるはずです。これは、 Uglify-JSのパーサーを使用し、必要なものをすべて提供すると思います。簡単なサンプル:
src.js:
var jobs, found, list;
jobs = mylibrary.getJobs();
found = jobs.find("Python");
list = found.convert("html");
ast.js:
var fs = require('fs'),
burrito = require('burrito');
var src = fs.readFileSync('./src.js', 'utf8');
burrito(src, function (node) {
console.log(node.name, node.value);
});
要求された構造を正確にどのように構築するかはよくわかりませんが (AST の構文解析に精通していません)、あなたの側で何らかの努力が必要になると確信しています。おそらく、いわば中間の構造は必要ありませんが、ブリトーから各ノードを検証するだけで、各ノードがそのcall
値 (関数名、オブジェクト名など) に対して検証され、そうでない場合は警告が発生します。検証しません。
上記の呼び出しからの出力は次のburrito
とおりです (注: すべて[Object]
またはそのようなものは node.js' によって切り捨てられていconsole.log
ます。値は実際にはブリトーの解析ツリー内のノードであるため、各値には関連付けられた状態などがあります)。
var [ [ [ 'jobs' ], [ 'found' ], [ 'list' ] ] ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'jobs' ],
[ [Object], [Object], [] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'jobs' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'getJobs' ],
[] ] ]
name [ 'jobs' ]
call [ [ 'dot', [ 'name', 'mylibrary' ], 'getJobs' ], [] ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'found' ],
[ [Object], [Object], [Object] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'found' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'find' ],
[ [Object] ] ] ]
name [ 'found' ]
call [ [ 'dot', [ 'name', 'jobs' ], 'find' ],
[ [ [Object], 'Python' ] ] ]
string [ 'Python' ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'list' ],
[ [Object], [Object], [Object] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'list' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'convert' ],
[ [Object] ] ] ]
name [ 'list' ]
call [ [ 'dot', [ 'name', 'found' ], 'convert' ],
[ [ [Object], 'html' ] ] ]
string [ 'html' ]
アップデート:
もう 1 つのオプションは、より新しい (?) ES パーサーEsprimaです。これは、より積極的に開発され、より適切に文書化されているようです。また、伝えられるところによると、Ugliify よりも高速です。Parsing Demo pageで解析などを試すことができます。これを使用して、良いソリューションを構築できるはずです。