2

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

4

3 回答 3

2

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

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

或者,如果您确实需要这些类型的实例,那么您将需要生成IProjects,为其添加 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

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

于 2013-04-05T20:55:02.873 回答
1

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;
    }
});
于 2013-04-05T07:00:58.990 回答
0

根据https://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html这可以通过ASTRewrite. 我自己还没有尝试过,但它看起来很复杂。

于 2019-12-19T02:04:17.753 回答