我想要实现的是提取源代码的语言结构,例如
class Test {
String name; // (1)
Test(String name) { // (2)
this.name = name; // (3) (4)
}
String toString() {
return name; // (5)
}
}
我想弄清楚每个“名称”指的是什么。就像(3)和(5)是指(1)和(4)是指(2)。另一个例子是
Test t = new Test("t");
System.out.println(t);
我想知道t
是类型Test
以及它在哪里声明。
我使用从Eclipse 4.3 版本下载的 JDT 批处理编译器 (ecjsrc-4.3)来完成此任务。我选择这个而不是整个 JDT 框架的原因是因为有一个JDTCompilerAdapter
用于 Ant 的编译器,这是我将来需要的。
到目前为止,我在第 540 行添加了一个自定义 AstVisitor org.eclipse.jdt.internal.compiler.Compiler
,其中编译器已经为所有文件生成了 AstTree 和范围信息。
我的问题是,我不知道如何使用AstVisitorscope
中的每个visit
方法来获取这些信息。就像在第一个示例中一样,在 line 中this.name = name;
。在 LHS 上,它是一个FieldReference
forthis.name
和一个ThisReference
for this
。LHS 上没有 AstNode name
,因此我不知道如何获取它所指的字段。在 RHS 上,它是一个SingleNameReference
. 但是,如果我首先调用node.resolve(scope)
然后尝试打印出'node.resolvedType
and node.binding
,我将得到的是null
and java.lang.String name
。由于参数和字段都是String
,我无法区分它们。
在第二个示例中,我不知道如何获取两者的类型信息t
,我只能获取null
forresolveType
和<no type> t
for binding
。
以前有人做过吗?