1

我正在尝试构建一个分析程序,用于对使用 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 调用。

任何提示都会有所帮助。感谢期待。

4

0 回答 0