Я использую парсер org.eclipse.jdt.
Я хочу переписать этот код:
public void foo(){
...
...
if(a>b)
...
...
}
в это:
public void foo(){
...
...
System.out.println("hello");
if(a>b)
...
...
}
Предположим, что ifnode является узлом IF_STATEMENT, я могу сделать что-то похожее на это:
Block block = ast.newBlock();
TextElement siso = ast.newTextElement();
siso.setText("System.out.println(\"hello\");");
ListRewrite listRewrite = rewriter.getListRewrite(block, Block.STATEMENTS_PROPERTY);
listRewrite.insertFirst(ifnode, null);
listRewrite.insertFirst(siso, null);
rewriter.replace(ifnode, block, null);
но это будет вставлять инструкцию syso в начале метода, в то время как я хочу это прямо перед if.
Есть ли способ достичь этого?
Вы можете использовать приведенный ниже код для достижения этого (это добавит sysout непосредственно перед первым IfStatement
):
Block block = ast.newBlock();
TextElement siso = ast.newTextElement();
siso.setText("System.out.println(\"hello\");");
ListRewrite listRewrite = rewriter.getListRewrite(block, CompilationUnit.IF_STATEMENT);
listRewrite.insertFirst(siso, null);
TextEdit edits = rewriter.rewriteAST(document, null);
Также вы можете ограничить область перезаписи в IfStatement
:
ASTRewrite rewriter = ASTRewrite.create(ifNode.getAST());
Примечание: код не проверен. Дайте мне знать, если вы найдете какие-либо проблемы.