【问题标题】:Comment Line Dissapears After Rewriting a Node重写节点后注释行消失
【发布时间】:2012-11-27 21:04:38
【问题描述】:

我正在编写简单的重构,并注意到一件奇怪的事情。我正在重写的节点之前的注释行在重构后消失了。相关节点之后的 cmets 也会在节点内部传输并在新位置打破缩进。这很奇怪,我想问一下是jdt的bug还是我做错了什么,没有注意到。

例如,我的代码假设以最短分支首先出现的方式重构 if-else 语句。 当我尝试重构这个时:

    // pre
    if(a==6) { 
        a = 5;
        return false;
    } else { 
        a++;
    }
    //post 

我明白了:

    if (!(a==6)) { 
        a++;
    }
    //post 
else { 
        a = 5;
        return false;
    }

重构完成的相关sn-p:

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;
}

【问题讨论】:

    标签: eclipse-plugin eclipse-jdt automated-refactoring


    【解决方案1】:

    // pre 注释消失了,因为解析器认为它是下一条语句的一部分(由node 表示),您将其替换为newNode。当node 消失时,附加的评论也会消失。

    仍在思考为什么 // post 最终会出现在它所在的位置...尝试在设置其 then 和 else 语句之前替换 newNode

    【讨论】:

    • 我认为注释行不是 AST 的一部分,我也无法在 AST 查看器中看到它们。无论如何,我怎样才能将评论复制到newnode?我找不到任何看起来可以获取/设置评论的 Node 成员方法。
    • 最新的 AST 看到了三种类型的 cmets,其中一种是 Javadoc。 BodyDeclaration(MethodDeclaration 和其他的超类)类有一个 getJavadoc() 方法,该方法返回一个 Javadoc 实例。必须使用 getCommentList() 从 CompilationUnit 中检索其他类型的 cmets(包括 LineComment - 您拥有的)
    猜你喜欢
    • 2012-12-08
    • 2011-08-23
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多