単純なリファクタリングを書いていて、奇妙なことに気づきました。書き直しているノードの前のコメント行が、リファクタリング後に消えます。また、問題のノードの後のコメントはノード内に転送され、新しい場所でインデントが壊れます。これは非常に奇妙で、jdt のバグなのか、それとも私が何か間違ったことをしたのかを知りたいと思います。
たとえば、私のコードでは、最短の分岐が最初に現れるように if-else ステートメントをリファクタリングするとします。これをリファクタリングしようとすると:
// pre
if(a==6) {
a = 5;
return false;
} else {
a++;
}
//post
私はこれを得る:
if (!(a==6)) {
a++;
}
//post
else {
a = 5;
return false;
}
リファクタリングが行われる関連スニペット:
protected ASTRewrite createRewrite(CompilationUnit cu, SubProgressMonitor pm) {
pm.beginTask("Creating rewrite operation...", 1);
final AST ast = cu.getAST();
final ASTRewrite rewrite = ASTRewrite.create(ast);
cu.accept(new ASTVisitor() {
public boolean visit(IfStatement node) {
if (node.getStartPosition() > selection.getOffset() + selection.getLength() || node.getStartPosition() < selection.getOffset())
return true;
if (node.getElseStatement() == null)
return true;
int thenCount = countNodes(node.getThenStatement());
int elseCount = countNodes(node.getElseStatement());
if(thenCount <= elseCount)
return true;
IfStatement newnode = ast.newIfStatement();
PrefixExpression neg = negateExpression(ast, rewrite, node.getExpression());
newnode.setExpression(neg);
newnode.setThenStatement((org.eclipse.jdt.core.dom.Statement) rewrite.createMoveTarget(node.getElseStatement()));
newnode.setElseStatement((org.eclipse.jdt.core.dom.Statement) rewrite.createMoveTarget(node.getThenStatement()));
rewrite.replace(node, newnode, null);
return true;
}
});
pm.done();
return rewrite;
}