如何使用ASTRewrite使用JDT插入/更新方法体?

时间:2011-08-12 04:36:59

标签: eclipse-plugin eclipse-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(),但它会生成编译时错误,说明非法参数或运行时异常。

2 个答案:

答案 0 :(得分:0)

您还需要一个步骤:写入文件。编辑(应用)不会写入文件。 示例见: Rewrite method incorrectly rewrite change to ICompilationUnit the second rewrite update

答案 1 :(得分:0)

(由于遗漏了oldBody的声明,我在下面假设一个正确的声明。)

必须删除以下行:

methodToBeImplemented.setBody(body);

使用上面的行,您可以手动更改应该是ASTRewrite目标的节点。通常不建议这样做。

接下来,你的电话

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

失败,因为目标节点(第一个参数)和目标节点属性(第二个参数)必须匹配节点类。但在您的情况下,它是Block (oldBody)MethodDeclaration (BODY_PROPERTY)。一个正确的电话是:

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

ASTRewrite.set()的替代解决方案是这个电话:

astRewrite.replace(oldBody, body, null);