如何将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实例,所以我可以访问IMethod
和IType
对象。
这实际上是不可能的。 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访问者模式访问方法声明节点和类型声明节点,并获取IMethod
和IType
对象,如下所示:
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; } });