Eclipse Java AST parser: вставить оператор перед if / for / while

1

Я использую парсер 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.

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

Теги:
parsing
abstract-syntax-tree
eclipse-jdt

1 ответ

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню