2

単純なリファクタリングを書いていて、奇妙なことに気づきました。書き直しているノードの前のコメント行が、リファクタリング後に消えます。また、問題のノードの後のコメントはノード内に転送され、新しい場所でインデントが壊れます。これは非常に奇妙で、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;
}
4

1 に答える 1

2

パーサーが次の// preステートメント ( で表される) の一部であると見なすため、コメントは消えます。nodeこれを に置き換えますnewNodenode消えると、添付のコメントも消えます。

// postなぜそれがどこで終わるのかまだ考えています... then および else ステートメントを設定する前に newNode を置き換えてみてください

于 2012-11-28T03:28:34.880 に答える