如何将AST转换为JDT Java模型

我正在为我的插件编写unit testing,它使用了JDT的IType和IMethod接口。 要编写unit testing,我需要实例化这样的接口。 这个问题的答案显示了如何创建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对象。

这实际上是不可能的。 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

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

而不是创建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; } });