JavaParser-获取类型化AST

JavaParser-获取类型化AST,java,abstract-syntax-tree,javaparser,Java,Abstract Syntax Tree,Javaparser,我想从JavaParser或另一个Java代码解析器中获取类型化AST。这意味着我将能够获得特定变量的类型或参数+方法的返回类型。我在谷歌上搜索了很多关于JavaParser这个特性的信息,但是没有找到任何东西,我想这是因为JavaParser生成了非类型化的AST。所以,请告诉我如何才能得到这个。但请不要说要解析所有代码并生成我自己的类型集,我尝试过,这非常困难,我认为这比生成我自己的AST解析器更困难。我是JavaParser的贡献者,我只是在Clojure中,在JavaParser的基础上

我想从JavaParser或另一个Java代码解析器中获取类型化AST。这意味着我将能够获得特定变量的类型或参数+方法的返回类型。我在谷歌上搜索了很多关于JavaParser这个特性的信息,但是没有找到任何东西,我想这是因为JavaParser生成了非类型化的AST。所以,请告诉我如何才能得到这个。但请不要说要解析所有代码并生成我自己的类型集,我尝试过,这非常困难,我认为这比生成我自己的AST解析器更困难。

我是JavaParser的贡献者,我只是在Clojure中,在JavaParser的基础上完成了这项工作。我在一篇文章中解释了如何实现这一点

JavaParser或任何其他解析器只需构建代码的抽象语法树(AST),然后您必须解析符号以了解哪些引用与哪些声明关联

假设您的代码中有如下内容:

a = 1;
现在,要理解a的类型,您应该找到它的声明位置。它可以是对参数、局部变量、当前类中声明的字段或继承的字段的引用。如果它是继承的字段,您应该找到父类的代码(或字节码),并在那里查找a的声明。解析器并没有做到这一点,解析器只是获取一个字符串(或一个文件)并构建一个AST


建立一个符号分解器不是火箭科学,但它需要一点工作。我在上面链接的帖子中描述的解决方案可以在GitHub上获得,如果您愿意,我很乐意帮助您使用它(即使它是用Clojure编写的,您也可以很容易地从Java调用它)

我不知道您想要实现什么(在您的问题中,这可能会很有趣)但是你可能想看看sonarqube的sonar java插件:当我们解析和构造一个语法树时,OP非常清楚“纯语法树”不是他想要的。“制作你自己的AST解析器”并添加必要的东西来计算java等语言的类型,这比你想象的要大得多;我的公司为我们自己的工具做了这件事。构建AST是迄今为止最容易的部分。我建议你找一些已经做到这一点的东西并使用它。Java编译器具有某种内部API,用于访问已解析的程序;我想它也有一些类型信息。Ira,我不是说实现一个功能齐全的解决方案,几乎和你的一样强大。我正在讨论解决95%个简单的情况,其中基本上需要考虑局部变量、参数、字段和继承。对于软件,大多数人不希望得到95%正确的答案,特别是如果最后5%个是大量的工作(导入查找、泛型、类型擦除、匿名类、类文件、……)。你的回答不清楚。是的,我们需要一些类似于您所做的事情作为起点。是的,我想查找每个内部块以找到变量声明,但它是另一个类的公共静态变量,不起作用。因此,我找到了JDT的解决方案,它自己解析变量类型