Как использовать ASTRewrite для вставки/обновления тела метода с помощью JDT?

Я хочу написать код внутри метода, используя JDT ASTRewrite. Я пытался использовать ASTRewrite, но он не работает. Пожалуйста, помогите. Пример кода моего ASTRewrite приведен ниже:

public void implementMethod(MethodDeclaration methodToBeImplemented) {
    astOfMethod = methodToBeImplemented.getAST(); 
    ASTRewrite astRewrite = ASTRewrite.create(astOfMethod);

    Block body = astOfMethod.newBlock();
    methodToBeImplemented.setBody(body);

    MethodInvocation newMethodInvocation = astOfMethod.newMethodInvocation();  
    QualifiedName name = astOfMethod.newQualifiedName(astOfMethod  
            .newSimpleName("System"), astOfMethod.newSimpleName("out"));  
    newMethodInvocation.setExpression(name);  
    newMethodInvocation.setName(astOfMethod.newSimpleName("println"));

    ExpressionStatement expressionStatement = astOfMethod.newExpressionStatement(newMethodInvocation);  
    body.statements().add(expressionStatement);

    astRewrite.set(oldBody, MethodDeclaration.BODY_PROPERTY, body, null);

    ctcObj.document = new Document(ctcObj.source);
    edit = astRewrite.rewriteAST(ctcObj.document, null);
    try {
        edit.apply(ctcObj.document);
    } catch (MalformedTreeException e) {    
        e.printStackTrace();
    } catch (BadLocationException e) {
        e.printStackTrace();
    }
}

Я пытался использовать разные типы ASTRewrite.set(), но он генерирует либо ошибку времени компиляции, говорящую о недопустимых параметрах, либо исключения времени выполнения.


person sagar    schedule 12.08.2011    source источник
comment
В следующий раз, пожалуйста, очистите свой код перед публикацией. Я почистил его на этот раз, но это трудно читать.   -  person Andrew Eisenberg    schedule 13.08.2011


Ответы (2)


Вам нужен еще один шаг: запись в файл. edit (применить) не записывает в файл. Пример см.: Метод перезаписи неправильно переписывает изменение на ICompilationUnit второй переписать обновление

person sovanlandy    schedule 11.10.2012

(Поскольку объявление oldBody отсутствует, я предполагаю, что следующее объявление правильное.)


Необходимо удалить следующую строку:

methodToBeImplemented.setBody(body);

В приведенной выше строке вы вручную меняете узел, который должен быть целью ASTRewrite. Обычно это не рекомендуется.

Далее ваш звонок

astRewrite.set(oldBody, MethodDeclaration.BODY_PROPERTY, body, null);

терпит неудачу, потому что целевой узел (1-й параметр) и свойство целевого узла (2-й параметр) должны совпадать в отношении класса узла. Но в вашем случае это Block (oldBody) и MethodDeclaration (BODY_PROPERTY). Правильный вызов:

astRewrite.set(methodToBeImplemented, MethodDeclaration.BODY_PROPERTY, body, null);

Альтернативным решением для ASTRewrite.set() может быть такой вызов:

astRewrite.replace(oldBody, body, null);
person sevenforce    schedule 03.09.2015