JavaScript:解析Java源代码,提取方法

时间:2017-10-25 00:32:51

标签: javascript java node.js babeljs abstract-syntax-tree

我正在尝试使用nodeJs构建一个返回给定Java源代码的所有方法的模块。到目前为止,我可以使用“java-parser”模块构建AST树,但我需要遍历它以过滤掉方法。

 code = ' public class CallingMethodsInSameClass
 {
    public static void main(String[] args) {
        printOne();
        printOne();
        printTwo();
 }
 public static void printOne() {
    System.out.println("Hello World");
 }

 public static void printTwo() {
    printOne();
    printOne();
} }';

var javaParser = require("java-parser");
var traverse = require("babel-traverse").default;
var methodsList = [];
traverse(ast, {
  enter(path){
  //do extraction
  }
}

我知道babel-traverse适用于Js但是我想要一种遍历的方法,所以我可以过滤这些方法。 我收到此错误

throw new Error(messages.get("traverseNeedsParent", parent.type));
  ^

 Error: You must pass a scope and parentPath unless traversing a 
 Program/File. Instead of that you tried to traverse a undefined node 
 without passing scope and parentPath.

如果记录的AST看起来像

{ node: 'CompilationUnit',
  types: 
   [ { node: 'TypeDeclaration',
       name: [Object],
       superInterfaceTypes: [],
       superclassType: null,
       bodyDeclarations: [Array],
       typeParameters: [],
       interface: false,
       modifiers: [Array] } ],
  package: null,
  imports: [] }

其中方法将由 types 中的“MethodDeclaration”标识。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

AST只是另一个JSON对象。试试jsonpath

npm install jsonpath

要提取所有方法,只需按条件node=="MethodDeclaration"进行过滤:

var jp = require('jsonpath');
var methods = jp.query(ast, '$.types..[?(@.node=="MethodDeclaration")]');
console.log(methods);

有关更多JSON路径语法,请参阅here