Java 如何从EclipseJDT核心批处理编译器中提取范围信息
例如,我想要实现的是提取源代码的语言结构Java 如何从EclipseJDT核心批处理编译器中提取范围信息,java,eclipse,compiler-construction,eclipse-jdt,Java,Eclipse,Compiler Construction,Eclipse Jdt,例如,我想要实现的是提取源代码的语言结构 class Test { String name; // (1) Test(String name) { // (2) this.name = name; // (3) (4) } String toString() { return name; // (5) } } 我想弄清楚每个“名字”指的是什么。如(3)和(5)是指(1)和(4)是指
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
,它在哪里声明
我使用从下载的JDT批处理编译器(ecjsrc-4.3)执行此任务。我之所以选择这个而不是整个JDT框架,是因为这个Ant编译器已有一个JDTCompilerAdapter
,这是我将来需要的
到目前为止,我在org.eclipse.jdt.internal.compiler.compiler
中的第540行添加了一个自定义AstVisitor,其中编译器已经为所有文件生成了AstTree和范围信息
我的问题是,我不知道如何在AstVisitor中的每个visit
方法中使用scope
,以获取这些信息。与第一个示例一样,在第行this.name=name代码>。在LHS上,它是此的字段参考
。名称
和此的字段参考
。LHS上没有用于name
的AstNode,因此我不知道如何获取它所指的字段。在RHS上,它是一个SingleNameReference
。但是,如果我首先调用node.resolve(scope)
,然后尝试打印出'node.resolvedType
和node.binding
,我将得到null
和java.lang.String name
。因为参数和字段都是字符串
,所以我无法区分它们
在第二个示例中,我也不知道如何获取t
的类型信息,对于resolveType
我只能获取null
,对于binding
我只能获取t
以前有人这样做过吗