我正在尝试使用Eclipse JDT的AST模型将一个MethodInvocation
替换为另一个Log.(i/e/d/w)
。举一个简单的例子 - 我正试图通过调用System.out.println()
来取代对ASTVisitor
的所有来电。我正在使用ASTNode
找到有趣的 MethodInvocation
并将其替换为新的class StatementVisitor extends ASTVisitor {
@Override
public boolean visit(ExpressionStatement node) {
// If node is a MethodInvocation statement and method
// name is i/e/d/w while class name is Log
// Code omitted for brevity
AST ast = node.getAST();
MethodInvocation newMethodInvocation = ast.newMethodInvocation();
if (newMethodInvocation != null) {
newMethodInvocation.setExpression(
ast.newQualifiedName(
ast.newSimpleName("System"),
ast.newSimpleName("out")));
newMethodInvocation.setName(ast.newSimpleName("println"));
// Copy the params over to the new MethodInvocation object
mASTRewrite.replace(node, newMethodInvocation, null);
}
}
}
节点。以下是代码大纲:
Log.i("Hello There");
然后将此重写保存回原始文档。这一切都很好,但是对于一个小问题 - 原始陈述:
System.out.println("Hello There")
更改为:
{{1}}
注意:语句末尾的分号缺失
问题:如何在新语句的末尾插入分号?
答案 0 :(得分:4)
找到答案。诀窍是将newMethodInvocation
对象包装在ExpressionStatement
类型的对象中,如下所示:
ExpressionStatement statement = ast.newExpressionStatement(newMethodInvocation);
mASTRewrite.replace(node, statement, null);
基本上,将代码示例中的最后一行替换为上面两行。