如何从Eclipse JDT核心批处理编译器中提取范围信息

时间:2013-08-27 18:22:41

标签: 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)参考(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上,FieldReferencethis.nameThisReferencethis。 LHS上没有name的AstNode,因此我不知道如何获取它指的是哪个字段。在RHS上,它是SingleNameReference。但是,如果我首先调用node.resolve(scope)然后尝试打印出'node.resolvedTypenode.binding,那么我将获得nulljava.lang.String name。由于参数和字段都是String,我无法区分它们。

在第二个示例中,我不知道如何获取t的类型信息,我只能null获取resolveType<no type> t获取binding 1}}。

之前有人这么做过吗?

0 个答案:

没有答案