我想使用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(),但它会生成编译时错误,说明非法参数或运行时异常。
答案 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);