我正在尝试构建一个分析程序,用于对使用 esprima 和 estraverse 提供给程序的 java 脚本文件进行静态分析。我想区分用户定义的本地函数和对对象的本机库的调用,例如“Object.prototype()、Object.getOwnProperties()”。
var fs = require('fs');
var esprima = require('esprima');
var estraverse = require('estraverse');
var functionsStats = {}; //1
var addStatsEntry = function(funcName) { //2
if (!functionsStats[funcName]) {
functionsStats[funcName] = {calls: 0, declarations:0};
}
};
var filename = process.argv[2];
console.log('Processing', filename);
var ast = esprima.parse(fs.readFileSync(filename));
estraverse.traverse(ast, {
enter: function(node) {
if (node.type === 'FunctionDeclaration') {
addStatsEntry(node.id.name); //4
functionsStats[node.id.name].declarations++;
} else if (node.type === 'CallExpression' && node.callee.type === 'Identifier') {
addStatsEntry(node.callee.name);
functionsStats[node.callee.name].calls++; //5
}
}
});
不确定如何区分原生 API 调用。
任何提示都会有所帮助。感谢期待。