4

EclipseJDTのASTモデルを使用して1つMethodInvocationを別のものに置き換えようとしています。Log.(i/e/d/w)簡単な例を挙げると、へのすべての呼び出しをへの呼び出しに置き換えようとしていますSystem.out.println()。を使用して、興味深いASTVisitorものを見つけ、新しいノードに置き換えています。コードの概要は次のとおりです。 ASTNodeMethodInvocation

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);
        }
    }
}

この書き換えは、元のドキュメントに保存されます。このすべては正常に機能していますが、1つの小さな問題-元のステートメント:

Log.i("Hello There");

変更点:

System.out.println("Hello There")

:ステートメントの最後にセミコロンがありません

質問:新しいステートメントの最後にセミコロンを挿入するにはどうすればよいですか?

4

1 に答える 1

4

答えが見つかりました。秘訣は、次のようなnewMethodInvocationタイプのオブジェクトでオブジェクトをラップすることです。ExpressionStatement

ExpressionStatement statement = ast.newExpressionStatement(newMethodInvocation);
mASTRewrite.replace(node, statement, null);

基本的に、コードサンプルの最後の行を上記の2行に置き換えます。

于 2013-03-01T05:29:03.473 に答える