Как добавить источник метода в существующий файл Java с JDT? - PullRequest
0 голосов
/ 14 июля 2011

Я пишу простой плагин 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. используйте testUnit.getAST().newMethodDeclaration() для создания метода, а затем обновите его.

Но я неМне не нравятся эти две опции, я надеюсь, что есть что-то вроде insertMethod, которое может позволить мне добавить некоторый текст в блок компиляции теста или преобразовать код теста в MethodDeclaration, а затем добавить к блоку компиляции теста.


ОБНОВЛЕНИЕ

Я вижу ответ nonty и обнаружил, что в jdt есть два CompilationUnit.Один org.eclipse.jdt.internal.core.CompilationUnit, другой org.eclipse.jdt.core.dom.CompilationUnit.Я использовал второй, а nonty использовал первый.

Мне нужно дополнить свой вопрос: сначала я хочу создать плагин eclipse, но позже мне было трудно создать сложный интерфейс с помощью SWTПоэтому я решил создать веб-приложение для генерации кода.Я скопировал эти jdt-баночки из затмения, так что я могу просто использовать org.eclipse.jdt.core.dom.CompilationUnit.

Есть ли способ использовать org.eclipse.jdt.internal.core.CompilationUnit вне затмения?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2015

JavaCore имеет метод для создания CompilationUnit из данного IFile.

IFile file;    
JavaCore.createCompilationUnitFrom(file);
0 голосов
/ 14 июля 2011

Что не так с

...
String newTestCode = "public void testSetName() { .... }";
IProgressMonitor monitor = new NullProgressMonitor();

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

Вы даже можете указать, куда добавить новый метод и "перезаписать" ли какой-либо из существующих методов.

...