我正在编写一个简单的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
。
我现在知道两个选择:
jdt
}
,只是将新代码插入测试文件中
testUnit.getAST().newMethodDeclaration()
创建方法,然后进行更新。但是我不喜欢这两个选项,我希望有类似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
?
答案 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);