我想要实现的是提取源代码的语言结构,例如
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 release下载的JDT批处理编译器(ecjsrc-4.3)来执行此任务。我选择这个而不是整个JDT框架的原因是因为Ant的这个编译器已经存在JDTCompilerAdapter
,这是我将来需要的。
到目前为止,我在org.eclipse.jdt.internal.compiler.Compiler
的第540行添加了一个自定义AstVisitor,其中编译器已经为所有文件生成了AstTree和范围信息。
我的问题是,我不知道如何在AstVisitor中的每个scope
方法中使用visit
来获取这些信息。与第一个示例一样,在行this.name = name;
中。在LHS上,FieldReference
为this.name
,ThisReference
为this
。 LHS上没有name
的AstNode,因此我不知道如何获取它指的是哪个字段。在RHS上,它是SingleNameReference
。但是,如果我首先调用node.resolve(scope)
然后尝试打印出'node.resolvedType
和node.binding
,那么我将获得null
和java.lang.String name
。由于参数和字段都是String
,我无法区分它们。
在第二个示例中,我不知道如何获取t
的类型信息,我只能null
获取resolveType
而<no type> t
获取binding
1}}。
之前有人这么做过吗?