如何将AST转换为JDT Java模型

时间:2013-04-04 13:50:03

标签: java eclipse eclipse-jdt abstract-syntax-tree

我正在为我的插件编写单元测试,它使用了JDT的IType和IMethod接口。要编写单元测试,我需要实例化这样的接口。回答 this question展示了如何创建AST模型,但我不知道如何将其转换为Java模型?

我的代码如下所示:

String source = 

  "package com.test\n" +
  "\n" +
  "import com.test.something;" + 
  "\n" +
  "public class Class{\n" +
  "int sum(int a, int b)\n" +
  "}\n";

ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setSource(source.toCharArray());
CompilationUnit unit = (CompilationUnit) parser.createAST(null);

所以我有一个CompilationUnit的实例,但是我需要一个ICompilationUInit实例,所以我可以访问IMethodIType个对象。

3 个答案:

答案 0 :(得分:2)

这实际上是不可能的。 ICompilationUnit是java模型的一部分,这意味着它是某个Java项目的一部分,并且有一个完整的类路径,一个包,一个包根等等。你所做的就是创建一些解析树未连接到任何java项目的文本。

如果您可以更具体地了解您的目标是什么,那么您可能不需要任何IType和IMethod实例。

或者,如果您确实需要这些类型的实例,那么您将需要生成IProject,为其添加java性质,然后使用文件填充它。您最好的选择是了解JDT测试基础架构的工作原理。

看一下这个文件:https://github.com/eclipse/eclipse.jdt.core/blob/master/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java

以及如何在整个测试框架中使用它。

答案 1 :(得分:1)

而不是设置ICompilationUnit的实例您可以使用 AST访客模式访问方法声明节点& 输入声明节点并获取IMethodIType个对象,如下所示:

compilationUnit.accept(new ASTVisitor() {

    public boolean visit(MethodDeclaration node) {                                                  
        IMethod iMethod = (IMethod) node.resolveBinding().getJavaElement();                                             
        return true;
    }

    public boolean visit(TypeDeclaration node) {                                                   
        IType iType = (IType) node.resolveBinding().getJavaElement();                                                   
        return true;
    }
});

答案 2 :(得分:0)

根据https://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.htmlASTRewrite是可能的。我自己还没有尝试过,但是看起来很复杂。