Как использовать ASTRewrite для вставки / обновления тела метода с использованием JDT? - PullRequest
0 голосов
/ 12 августа 2011

Я хочу написать код внутри метода, используя 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 (), но он генерирует либо ошибку времени компиляции, говоря неверные параметры, либо исключения времени выполнения.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2015

(Поскольку объявление 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);
0 голосов
/ 11 октября 2012

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

...