2

我想要实现的是提取源代码的语言结构,例如

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 上,它是一个FieldReferenceforthis.name和一个ThisReferencefor this。LHS 上没有 AstNode name,因此我不知道如何获取它所指的字段。在 RHS 上,它是一个SingleNameReference. 但是,如果我首先调用node.resolve(scope)然后尝试打印出'node.resolvedTypeand node.binding,我将得到的是nulland java.lang.String name。由于参数和字段都是String,我无法区分它们。

在第二个示例中,我不知道如何获取两者的类型信息t,我只能获取nullforresolveType<no type> tfor binding

以前有人做过吗?

4

0 回答 0