2015-03-17 3 views
1

Я использую парсер org.eclipse.jdt.Eclipse Java AST parser: insert statement before if/for/while

Я хочу, чтобы переписать этот код:

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 ,

Есть ли способ достичь этого?

ответ

0

Вы можете использовать следующий код для достижения этой цели (это добавит 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()); 

Примечание: код не проверен. Дайте мне знать, если вы найдете какие-либо проблемы.

+0

ListRewrite listRewrite = rewriter.getListRewrite (block, CompilationUnit.IF_STATEMENT); не является допустимым, поскольку getListRewrite() нуждается во втором параметре, который имеет тип ChildListPropertyDescriptor, тогда как CompilationUnit.IF_STATEMENT возвращает int. –

Смежные вопросы