如何使用JDT将方法源添加到现有的Java文件中?

时间:2011-07-14 17:07:23

标签: java eclipse-jdt

我正在编写一个简单的eclipse插件,它是一个代码生成器。用户可以选择现有方法,然后使用JDT在相应的测试文件中生成新的测试方法。

假设测试文件已经存在,其内容为:

public class UserTest extends TestCase {
    public void setUp(){}
    public void tearDown(){}
    public void testCtor(){}
}

现在我已经生成了一些测试代码:

/** complex javadoc */
public void testSetName() {
    ....
    // complex logic
}

我想要做的是将其附加到现有的UserTest。我必须编码:

String sourceContent = FileUtils.readFileToString("UserTest.java", "UTF-8");
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(content.toCharArray());
CompilationUnit testUnit = (CompilationUnit) parser.createAST(null);

String newTestCode = "public void testSetName() { .... }";

// get the first type
final List<TypeDeclaration> list = new ArrayList<TypeDeclaration>();
testUnit .accept(new ASTVisitor() {
    @Override
    public boolean visit(TypeDeclaration node) {
        list.add(node);
        return false;
    }
});
TypeDeclaration type = list.get(0);

type.insertMethod(newTestCode); // ! no this method: insertMethod 

但是没有这样的方法insertMethod

我现在知道两个选择:

  1. jdt
  2. 之前,不要使用},只是将新代码插入测试文件中
  3. 使用testUnit.getAST().newMethodDeclaration()创建方法,然后进行更新。
  4. 但是我不喜欢这两个选项,我希望有类似insertMethod的东西,它可以让我将一些文本附加到测试编译单元,或者将测试代码转换为MethodDeclaration,然后附加到测试编译单元。


    更新

    我看到nonty's answer,发现jdt中有两个CompilationUnit。一个是org.eclipse.jdt.internal.core.CompilationUnit,另一个是org.eclipse.jdt.core.dom.CompilationUnit。我使用了第二个,而nonty使用了第一个。

    我需要补充一下我的问题:首先我要创建一个eclipse-plugin,但后来我发现很难用swt创建一个复杂的UI,所以我决定创建一个web应用来生成代码。我从eclipse复制了那些jdt jar,所以我可以使用org.eclipse.jdt.core.dom.CompilationUnit

    有没有办法在日食之外使用org.eclipse.jdt.internal.core.CompilationUnit

2 个答案:

答案 0 :(得分:0)

有什么问题
...
String newTestCode = "public void testSetName() { .... }";
IProgressMonitor monitor = new NullProgressMonitor();

IMethod method = testUnit.getTypes[0].createMethod(newTestCode, null, false, monitor);

您甚至可以指定添加新方法的位置以及是否“覆盖”任何现有方法。

答案 1 :(得分:0)

JavaCore有一个从给定的IFile创建CompilationUnit的方法。

IFile file;    
JavaCore.createCompilationUnitFrom(file);