我想从JavaParser或其他Java代码解析器中键入AST。这意味着我将能够获得特定变量或参数的类型+方法的返回类型。我搜索了很多有关JavaParser的功能的信息,但是没有找到任何东西,我想这是因为JavaParser生成了无类型的AST。所以,请告诉我我如何能得到这个。但是请不要说要解析所有代码并创建自己的类型集,我尝试过,这非常困难,我认为这比制作自己的AST解析器难。
最佳答案
我是JavaParser的贡献者,而我只是在Clojure的JavaParser之上做到了这一点。我在一篇文章How to build a symbol solver for Java, in Clojure中解释了如何实施
JavaParser或任何其他解析器仅构建代码的抽象语法树(AST),然后必须解析符号以了解哪些引用与哪些声明相关联。
假设您的代码中包含以下内容:
a = 1;
现在,要了解a的类型,您应该找到它的声明位置。它可以是对参数,局部变量,当前类中声明的字段或继承的字段的引用。如果它是一个继承的字段,则应该找到父类的代码(或字节码),然后在其中查找a的声明。解析器不执行此操作,解析仅采用字符串(或文件)并构建AST。
构建符号解析器不是火箭科学,但需要一些工作。我在上面链接的文章中描述的解决方案可在GitHub上找到,我很乐意帮助您使用它(即使它是用Clojure编写的,也可以很容易地从Java调用它)